zoukankan      html  css  js  c++  java
  • 装饰模式

    这是一种比较常见的模式,定义如下:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。

    装饰模式有四个基本角色:

    • Component抽象构件

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

    • ConcreateComponent具体构件

    ConcreateComponent是最原始的、最核心的、最基本的接口或抽象类的实现,也是我们需要装饰的对象。

    • Decorator装饰角色

    这一般是一个抽象类,用来干什么呢?定义装饰角色的抽象方法,在属性中必然有一个指向Component抽象构件的的private变量。

    • 具体装饰角色

    用于把最原始、最核心、最基本的东西装饰为其他东西。

    下面看一段通用示例代码:

    //抽象构件
    public abstract  class Component{
        public abstract void operate();
    }
    //具体构件
    public class ConcreateComponent extends Component{
        @Override
        public void operate(){
        }
    }
    //抽象装饰者
    public abstract class Decorator extends Component{
        private Component component = null;
        //通过构造函数传递被修饰者
        public Decorator(Component component){
            this.component = component;
        }
        //委托给被修饰者执行
        public void operate(){
            this.component.operate();
        }
    }
    //具体的装饰类
    public class ConcreateDecorator1 extends Decorator{
        //定义被修饰者
        public ConcreateDecorator1(Component component){
                super(component);
        }
        //定义自己的修饰方法
        priate  void method1(){
        }
        //重写父类方法
        public void operate(){
            this.method1();
            super.operate();
        }
    }
    public class ConcreateDecorator2 extends Decorator{
        //定义被修饰者
        public ConcreateDecorator2(Component component){
            super(component);
        }
        //定义自己的修饰方法
        private void method2(){
        }
        //重写父类方法
        public void operate(){
            this.method2();
            super.operate();
        }
    }

    需要注意的是,原始方法和装饰方法的执行顺序在具体的装饰类中是固定的,但可以通过重载实现多种顺序的组合。

    装饰模式优点:

    • 装饰类和被装饰类可以独立发展,而不会相互耦合
    • 装饰模式是继承关系的一个替代方案,不管装饰多少层,返回的还是原始组件的实现方法,实现的是is-a关系
    • 可以动态扩展一个实现类的功能,这也是它的定义

    装饰模式缺点:

    • 多层装饰将会比较复杂,难以调试和发现问题,尽量减少装饰类的数量,降低系统复杂度。

    装饰模式场景:

    • 需要动态扩展一个类的功能,或给一个类增加附加功能
    • 可以动态增加或修改一些功能,可以动态撤销
  • 相关阅读:
    为什么写技术博客对新人如此重要?
    Javascript经典正则表达式
    关于读书的那些事,其实我一直...没有行动
    dede织梦CMS文件夹目录结构
    jQ初体验,^_^
    vi/vim 基本使用方法
    (X)HTML Strict 下的嵌套规则
    KISS保持简单:纪念丹尼斯·里奇
    关于jQuery性能优化
    编码规范CSSHTML 摘自kissyui
  • 原文地址:https://www.cnblogs.com/loveBolin/p/9736057.html
Copyright © 2011-2022 走看看