装饰模式有感

装饰模式

很久没写了,大部分文章都是前期写了一半,然后搁着想着等有空了再去完善下,但大多都是处在还没上传的阶段。最近空闲时间较多所以整理一些出来。 程序有时候像人生经历了才知道原来可以这样设计。设计模式就是一些经验的终结。模式是死的,有时候模式不能直接套用,而是根据自己的理解进行使用,有时可以多个模式组合使用; 此篇文章借鉴了《设计模式之禅》这本书,作者举例鲜明易懂推荐阅读;

设计模式的定义: 动态的给一个对象添加一些额外的职责。 就增加功能来说,装饰模式相比于子类更加灵活;

类图:

类图出自《设计模式之禅》 根据类图贴出源码来更容易理解;

被装饰抽象类

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 ConcreteDecoratorOne extends Decorator{
    public ConcreteDecoratorOne(Component _component){
        super(_component);
    }
    public void doSomething(){
        System.out.println("One do something.");
    }
    public void operate(){
        this.doSomething();
        super.operate();
    }
}

装饰器实现二类

public class ConcreteDecoratorTwo extends Decorator{
    public ConcreteDecoratorTwo(Component _component){
        super(_component);
    }
    public void doSomething(){
        System.out.println("Two do something.");
    }
    public void operate(){
        this.doSomething();
        super.operate();
    }
}

具体装饰调用

public class Client{
    public static void main(String[] args){
        Component component = new ConcreteComponent();
        //装饰
        component = new ConcreteDecoratorOne(component);
        //装饰
        component = new ConcreteDecoratorTwo(component);
        //运行装饰后的对象
        component.operate();
    }
}

装饰模式的优点:

  • 装饰和被装饰类可以独立发展,而不会互相耦合。换句话说Component类不需要知道Decorator类,Decorator类是从外部来扩展Component类的功能,而Decorator也不用知道具体的构件;
  • 装饰模式是继承关系的一个替代方案。不管装饰多少层返回的对象还是Component;
  • 装饰模式可以动态的扩展一个实现类的功能;

装饰的缺点:

  • 对于装饰模式如果多层装饰的话会变的很复杂。因此尽量减少装饰器数量,以便降低系统复杂度;

使用场景:

  • 需要扩展一个类的功能,或给一个类增加附加功能;
  • 需要动态的给一个对象增加功能,这些功能可以再动态的撤销;
  • 需要为一批兄弟类镜像改装或加装功能,当然首选装饰模式;

以上就是装饰模式。具体使用时刻参考是否符合业务场景,不可硬搬;

转载于:https://my.oschina.net/u/2321760/blog/3055037

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值