设计模式从零开始——装饰者模式

来源:互联网 发布:港航物流软件 编辑:程序博客网 时间:2024/06/06 16:57

这次也不是第一次下决心开展一个系列的博客,但是之前大多都半路放弃了

那时候想着通过自己学习和实践的东西去完成一个系列的博客,但是发现自己整理的东西没有体系不说,写出来的东西再回来看也差强人意


这次看着《大话设计模式》这本书,学习书中的设计模式的东西,按照学习的顺序,准备一步一步把学到的东西写进自己的博客里

自己能更好的理解,也希望通过自己的整理和总结,对看过的人也能有一定的帮助


废话不多数,从开篇到现在,这是学习的第三种设计模式——【装饰者模式】


对于装饰者模式,和之后会写到的建造者模式,在我理解这两种模式和前两篇写的简单工厂和策略模式有着出发点的不同,也就是能用到

这几种设计模式的情境完全不一样


对于简单工厂和策略模式来说,更多的是为了通过条件判断,来执行不同的功能。例如当你点一份外卖,具体点的是披萨,炒饭还是牛排,

这些外卖的品种就是具体的功能实现,需要调用到工厂方法来判断具体要点那种外卖,好让你想吃的外卖送到你手里


而装饰者模式是基于你已经实现的功能进行进一步的封装,保证程序能执行你设定好的特定的功能。

比如拿一个人穿衣服举例,穿T恤,穿裤子,穿外套,穿内裤都是具体要实现的功能,正常人的理解都是先穿内裤,然后再穿T恤、裤子,

最后穿外套。但是如果这些顺序错乱一下,先穿外套,再穿T恤、裤子,最后穿内裤,这种打扮必定回头率250%。


好多工作中需要执行的方法也要遵照特定的顺序执行,比如一个支付功能,先下单、再结账,然后发货这是正常程序,但是如果一件商品,先发货了,

没人下单,那谁还会来付这笔钱呢?


所以装饰者模式是通过一定的业务逻辑,把需要实现的具体功能依次串联起来,保证功能能正确且完整的实现出来。


以下是用穿衣举例,使用装饰者模式实现的代码:


需要穿衣的人:

public class Person {    public Person() {    }    private String name;    public Person(String name) {        this.name = name;    }    public void Show() {        System.out.println("装扮的" + name);    }}


穿衣打扮的基础类,需要是具体实现类来继承它:

public class Finery extends Person {    protected Person component;    public void Decorate(Person component) {        this.component = component;    }    @Override    public void Show() {        if (component != null) {            component.Show();        }    }}

穿裤子:

public class BigTrouser extends Finery {    @Override    public void Show() {        System.out.print("垮裤 ");        super.Show();    }}

穿T恤:

public class TShirts extends Finery {    @Override    public void Show() {        System.out.print("大T恤 ");        super.Show();    }}


客户端程序:

public class DressUp {    public static void main(String[] args) {        Person person = new Person("Bruce");        System.out.println("装扮:");        TShirts tShirts = new TShirts();        BigTrouser bigTrouser = new BigTrouser();        tShirts.Decorate(person);        bigTrouser.Decorate(tShirts);        bigTrouser.Show();    }}


功能实现截图:


原创粉丝点击