大话设计模式之装饰模式

来源:互联网 发布:淘宝店铺号申请 编辑:程序博客网 时间:2024/05/16 11:36

参考—>《大话之设计模式》感谢作者—org
先看一下结构图
这里写图片描述

装饰模式
如果只有一个ConcreteComponent类而没有抽象的Component类,那么
Decorator类可以是ConcreteComponent的一个子类
(在这儿的代码就是把Person这个ConcreteComponent类和Finery 这个Decorator类建立了父子关系)
同理
如果只有一个ConcreteDecorator那么也没必要建立一个单独的Decorator
类,而且可以把Decorator和ConcreteDecorator的责任合并成一个类。

这里写图片描述

代码—>
Person.java (ConcreteComponent)

package co.jp.li.concretecomponent;public class Person {    private String name;    public Person() {        super();    }    public Person(String name) {//      super();        this.name = name;    }    public void show(){        System.out.print("を着ている"+this.name);    }}

Finery.java(decorator)

package co.jp.li.decorator;import co.jp.li.concretecomponent.Person;public class Finery extends Person {    protected Person person;    public void Decorate(Person person) {        this.person = person;    }    @Override    public void show() {        // TODO Auto-generated method stub        if (person != null) {            person.show();        }    }}

BigTrouser.java 和Kimono.java 和TShirt.java

package co.jp.li.concretedecorator;import co.jp.li.decorator.Finery;public class BigTrouser extends Finery {    @Override    public void show() {        // TODO Auto-generated method stub        System.out.print("BigTrouser" + "\t");        super.show();     }}package co.jp.li.concretedecorator;import co.jp.li.decorator.Finery;public class Kimono extends Finery {    @Override    public void show() {        // TODO Auto-generated method stub        System.out.print("着物\t");        super.show();    }}package co.jp.li.concretedecorator;import co.jp.li.decorator.Finery;public class TShirt extends Finery {    @Override    public void show() {        // TODO Auto-generated method stub        System.out.print("TShirt" + "\t");        super.show();     }}

coursom.java 客户测试类—>

package co.jp.li.client;import co.jp.li.concretecomponent.Person;import co.jp.li.concretedecorator.BigTrouser;import co.jp.li.concretedecorator.Kimono;import co.jp.li.concretedecorator.TShirt;public class coursom {    public static void main(String[] args) {        // TODO Auto-generated method stub        Person person = new Person("佐藤");        System.out.print("衣装は--->");        TShirt tShirt = new TShirt();        BigTrouser bigTrouser = new BigTrouser();        Kimono kimono = new Kimono();        bigTrouser.Decorate(person);        tShirt.Decorate(bigTrouser);        kimono.Decorate(tShirt);        kimono.show();    }}

总结—
装饰模式是为已有功能动态地添加更多功能的一种方式。
使用场合—
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类的
核心职责或主要行为,在主类中加入新的字段,方法,逻辑,从而增加了主类的复杂度。
装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装他所要修饰的对象,因此,当需要执行特殊行为时,客户代码可以在运行时根据需要有选择地,按顺序的使用装饰功能包装对象了。

装饰顺序很重要!!!

原创粉丝点击