• 装饰模式


    ● Component抽象构件

    Component是一个接口或者是抽象类,就是定义我们最核心的对象,也就是最原始的对

    注意 在装饰模式中,必然有一个最基本、最核心、最原始的接口或抽象类充当

    Component抽象构件。

    ● ConcreteComponent 具体构件

    ConcreteComponent是最核心、最原始、最基本的接口或抽象类的实现,你要装饰的就是

    它。

    ● Decorator装饰角色

    一般是一个抽象类,做什么用呢?实现接口或者抽象方法,它里面可不一定有抽象的方

    法呀,在它的属性里必然有一个private变量指向Component抽象构件。

    ● 具体装饰角色

    ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰类,你要把你最核心的、最

    原始的、最基本的东西装饰成其他东西

    抽象构件

    public abstract class Component {

         //抽象的方法

         public abstract void operate();

    }

    具体构件

    public class ConcreteComponent extends Component {

         //具体实现

         @Override

         public void operate() {

                 System.out.println("do Something");

         }

    }

    装饰角色通常是一个抽象类

    抽象装饰者

    public abstract class Decorator extends Component {

         private Component component = null;        

         //通过构造函数传递被修饰者

         public Decorator(Component _component){

                 this.component = _component;

         }

         //委托给被修饰者执行

         @Override

         public void operate() {

                 this.component.operate();

         }

    }

    具体的装饰类

    public class ConcreteDecorator1 extends Decorator {

         //定义被修饰者

         public ConcreteDecorator1(Component _component){

                 super(_component);

         }

         //定义自己的修饰方法

         private void method1(){

                 System.out.println("method1 修饰");

         }

    HuDun Demo

         //重写父类的Operation方法

         public void operate(){

                 this.method1();

                 super.operate();

         }

    }

    public class ConcreteDecorator2 extends Decorator {

         //定义被修饰者

         public ConcreteDecorator2(Component _component){

                 super(_component);

         }

         //定义自己的修饰方法

         private void method2(){

                 System.out.println("method2修饰");

         }

         //重写父类的Operation方法

         public void operate(){

                 super.operate();

                 this.method2();

         }

    }

    注意 原始方法和装饰方法的执行顺序在具体的装饰类是固定的,可以通过方法重载实

    现多种执行顺序。

    场景类

    public class Client {

         public static void main(String[] args) {

                 Component component = new ConcreteComponent();

                 //第一次修饰

                 component = new ConcreteDecorator1(component);

                 //第二次修饰

                 component = new ConcreteDecorator2(component);

                 //修饰后运行

                 component.operate();

         }

    }

     装饰模式的优点

    ● 装饰类和被装饰类可以独立发展,而不会相互耦合。换句话说,Component类无须知

    Decorator类,Decorator类是从外部来扩展Component类的功能,而Decorator也不用知道具

    体的构件。

    ● 装饰模式是继承关系的一个替代方案。我们看装饰类Decorator,不管装饰多少层,返

    回的对象还是Component,实现的还是is-a的关系。

    ● 装饰模式可以动态地扩展一个实现类的功能,这不需要多说,装饰模式的定义就是如

    此。

    装饰模式还有一个非常好的优点:扩展性非常好。

    装饰模式的缺点

    对于装饰模式记住一点就足够了:多层的装饰是比较复杂的。为什么会复杂呢?你想想

    看,就像剥洋葱一样,你剥到了最后才发现是最里层的装饰出现了问题,想象一下工作量

    吧,因此,尽量减少装饰类的数量,以便降低系统的复杂度。

    装饰模式的使用场景

    ● 需要扩展一个类的功能,或给一个类增加附加功能。

    ● 需要动态地给一个对象增加功能,这些功能可以再动态地撤销。

    ● 需要为一批的兄弟类进行改装或加装功能,当然是首选装饰模式。

  • 相关阅读:
    android权限大全
    Java反射经典实例
    SD卡的寄存器 SD总线协议 CRC算法
    ARM CortexM3 操作模式和特权级别
    使用 Printf via SWO/SWV 输出调试信息
    embOS实时操作系统 概览
    embOS实时操作系统 多任务调度
    android wifi hotspot
    Eclipse Java 智能提示
    ARM CortexM3 概览
  • 原文地址:https://www.cnblogs.com/future-zmy/p/6275702.html
Copyright © 2020-2023  润新知