Decorator:

        动态(组合)地给一个对象添加一些额外的职责,就增加功能来说,Decorator模式相比生成子类更为灵活(继承)

Java-23个设计模式 Decorator装饰者模式

① 创建Component组件(Human)

/**
 * 抽象类,人类
 */
public abstract class Human {
    // 跑
    abstract void run();
}

② 创建具体对象ConcreteComponent(Man和Woman)

public class Man extends Human {
    @Override
    void run() {
        System.out.println("Man没穿衣服在跑");
    }
}
public class Woman extends Human {
    @Override
    void run() {
        System.out.println("Woman没穿衣服在跑");
    }
}

③ 创建Decorator(HumanDecorator)中间件

/**
 * 同时继承+组合(Decorator)
 */
public class HumanDecorator extends Human {
    // 组合,将来支持实现(woman/man/?)
    private Human decoratorHuman;
    public HumanDecorator(Human decoratorHuman){
        this.decoratorHuman = decoratorHuman;
    }

    @Override
    void run() {
        /**
         * 实现类在调用是,是在运行期间确定Huam传入的对象
         * 来判断是man或者woman执行run
         */
        decoratorHuman.run();
    }

④ 创建 具体类ConcreteDecorator(DressTousers和DressJacket)

public class DressTrousers extends HumanDecorator {
    // 运行时,根据创建的man/woman选择子对象
    public DressTrousers(Human decoratorHuman) {
        super(decoratorHuman);
    }

    //
    public void runDecorator(){
        super.run();
        System.out.println("穿条裤子");
    }

}
public class DressJacket extends HumanDecorator {

    public DressJacket(Human decoratorHuman) {
        super(decoratorHuman);
    }

    //
    public void runDecorator(){
        super.run();
        System.out.println("穿条上衣");
    }
}

⑤ 测试(这里的话举例Man对象,用DressJack(穿上衣)进行修饰)

public class Test {
    public static void main(String[] args) {
        // 创建man
        Man man = new Man();
        System.out.println("正常:");
        man.run();
        System.out.println("---------------");
        DressJacket dressJacket = new DressJacket(man);
        System.out.println("装饰者调用,不添加职责:");
        dressJacket.run();
        System.out.println("---------------");
        System.out.println("装饰者调用,添加职责:");
        dressJacket.runDecorator();
        System.out.println("---------------");
    }
}

结果:
正常:
Man没穿衣服在跑
---------------
装饰者调用,不添加职责:
Man没穿衣服在跑
---------------
装饰者调用,添加职责:
Man没穿衣服在跑
穿条上衣

优点:若需要对man添加更多的职责,使用Decorator只需要对Decorator进行扩展。如果用继承的话,需要进行多次继承,增加             大量新的类。在装饰类越多的情况下越明显。

           组件可以自由组合,从简单到困难,即在需要的时候定义(实现特殊的功能,而不是复杂的特征)。

缺点:使用装饰时不应该依赖对象标识

          有许多小对象,容易定制但很难排错

相关文章:

  • 2021-10-02
  • 2022-01-22
  • 2021-12-04
  • 2021-08-17
  • 2021-10-18
  • 2021-07-24
  • 2021-09-28
猜你喜欢
  • 2021-04-15
  • 2021-09-24
  • 2021-09-14
  • 2021-10-08
  • 2021-10-06
  • 2022-12-23
  • 2021-09-09
相关资源
相似解决方案