结构性设计模式之装饰器模式

Posted 丨Jack_Chen丨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结构性设计模式之装饰器模式相关的知识,希望对你有一定的参考价值。

@TOC

装饰器模式

概述

实现原理

主要角色

装饰器模式主要包含4种角色

1.抽象组件(Component)

2.具体组件(ConcreteComponent)

3.抽象装饰器(Decorator)

4.具体装饰器(ConcreteDecorator)

应用场景

1.用于扩展一个类的功能或给一个类添加附加职责。

2.动态的给一个对象添加功能,这些功能可以再动态的澈销。

3.需要为一批的兄弟类进行改装或加装功能。

优缺点

优点:

1.装饰器是继承的补充,比继承灵活,不改变原有对象的情况下动态地给一个对象扩展功能,即插即用。

2.装饰器完全遵守开闭原则。

缺点:

1.会出现更多的代码,更多的类,增加程序复杂性。

2.通过使用不同装饰类以及这些装饰类的排列组合,可以实现不同效果。

3.动态装饰时,多层装饰时会更复杂。

装饰器模式的基本使用

创建抽象组件

创建Phone抽象类

public abstract class Phone 
    public abstract String call();
    public abstract double price();

具体组件

创建最基本具有打电话功能的手机

public class BasePhone extends Phone 
    @Override
    public String call() 
     return "BasePhone call";
    

    @Override
    public double price() 
        return 0.1;
    

抽象装饰器

创建一个抽象装饰器来扩展该只具备基本功能的手机

public abstract class PhoneDecorator extends Phone 
    private Phone phone;

    public PhoneDecorator(Phone phone) 
        this.phone = phone;
    

    @Override
    public String call() 
        return phone.call();
    

    @Override
    public double price() 
        return phone.price();
    

    /**
     * 扩展功能
     */
    public abstract void sendMsg();

具体装饰器

public class SatellitePhoneDecorator extends PhoneDecorator
    public SatellitePhoneDecorator(Phone phone) 
        super(phone);
    

    public void sendMsg() 
        System.out.println("PhoneCallDecorator sendMsg");
    

    @Override
    public String call() 
        return  "SatellitePhone call";
    

    @Override
    public double price() 
        return super.price()+100;
    

客户端调用

    public static void main(String[] args) 
        // 创建需要被装饰的原始对象(即要被装饰的对象)
        Phone phone = new BasePhone();
        System.out.println("使用: "+phone.call()+" 方式打电话,每分钟单价:" + phone.price());

        // 给对象透明的增加额外功能并调用
        PhoneDecorator phoneDecorator = new SatellitePhoneDecorator(phone);
        System.out.println("使用: "+phoneDecorator.call()+" 方式打电话,每分钟单价:" + phoneDecorator.price());

        // 装饰器也可以装饰具体的装饰对象,相当于给对象在增加的功能基础上在添加功能,这里体现在单价100.1基础上再+100
        PhoneDecorator satellitePhoneDecorator = new SatellitePhoneDecorator(phoneDecorator);
        System.out.println("使用: "+satellitePhoneDecorator.call()+" 方式打电话,每分钟单价:" + satellitePhoneDecorator.price());
        satellitePhoneDecorator.sendMsg();
    
使用: BasePhone call 方式打电话,每分钟单价:0.1
使用: SatellitePhone call 方式打电话,每分钟单价:100.1
使用: SatellitePhone call 方式打电话,每分钟单价:200.1
PhoneCallDecorator sendMsg

以上是关于结构性设计模式之装饰器模式的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之装饰器模式

Java23种设计模式之结构型模式「装饰器模式」

二十三种设计模式之装饰器模式

java设计模式之 装饰器模式

Java 设计模式之装饰器学习与掌握

Java 设计模式之装饰器学习与掌握