设计模式之装饰者模式(Decorator)

来源:互联网 发布:sublime text 3编译js 编辑:程序博客网 时间:2024/05/01 05:33
意图:
动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相对于生成子类更为灵活

适用性:
1.在不影响其他对象的情况下,以动态,透明的方式给单个对象添加职责.
2.处理那些可以撤销的职责.
3.当不能采用生成子类的方式进行扩充时.

效果:
1.比静态继承更灵活
2.避免在层次结构高层的类有太多的特性
3.Decorator与它的Component不一样
4.有许多小对象

代码实现:

package com.git.books.b_design_patterns.i_decorator;/** *  * @Description: 装饰模式 顶级定义类  对一个人进行装饰(穿衣) * @author: songqinghu * @date: 2017年3月4日 下午3:24:43 * Version:1.0 */public abstract class PeopleComponent {    protected People people;    public void setPeople(People people){        this.people = people;    }    public abstract void show();}

package com.git.books.b_design_patterns.i_decorator;/** *  * @Description: 人  * @author: songqinghu * @date: 2017年3月4日 下午3:25:53 * Version:1.0 */public class People {    private String name;    private int age;    private Gender gender;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public Gender getGender() {        return gender;    }    public void setGender(Gender gender) {        this.gender = gender;    }    @Override    public String toString() {        return " my name : " + name + ", age :" + age + ", gender : " + gender+ " ";    }}

package com.git.books.b_design_patterns.i_decorator;/** * @Description: 被装饰的实例类 * @author: songqinghu * @date: 2017年3月4日 下午3:31:01 * Version:1.0 */public class PeopleConcrete extends PeopleComponent {    public PeopleConcrete(People people) {        super();        setPeople(people);    }    @Override    public void show() {        System.out.println(people.toString());    }}

package com.git.books.b_design_patterns.i_decorator;/** *  * @Description: 装饰类接口定义类 * @author: songqinghu * @date: 2017年3月4日 下午3:34:39 * Version:1.0 */public abstract class PeopleDecorator extends PeopleComponent {    protected PeopleComponent component;    public PeopleDecorator(PeopleComponent component) {        this.component = component;        this.people = component.people;    }    //简单定义装饰行为    public abstract void action();}

package com.git.books.b_design_patterns.i_decorator;/** *  * @Description: 包装 使之穿上衣服 * @author: songqinghu * @date: 2017年3月4日 下午3:47:21 * Version:1.0 */public class ClothesDecorator extends PeopleDecorator {    public ClothesDecorator(PeopleComponent component) {        super(component);    }    @Override    public void action() {        System.out.println(people.getName() + " put on a beautiful dress");    }    @Override    public void show() {        action();        component.show();    }}

package com.git.books.b_design_patterns.i_decorator;/** * @Description: 包装 使之穿上裤子 * @author: songqinghu * @date: 2017年3月4日 下午3:47:51 * Version:1.0 */public class PantsDecorator extends PeopleDecorator {    public PantsDecorator(PeopleComponent component) {        super(component);    }    @Override    public void action() {        System.out.println(people.getName() + " put on a beautiful pants");    }    @Override    public void show() {        action();        component.show();    }}

package com.git.books.b_design_patterns.i_decorator;/** * @Description: 包装使之收获赞美 * @author: songqinghu * @date: 2017年3月4日 下午3:49:10 * Version:1.0 */public class PraiseDecorator extends PeopleDecorator {    public PraiseDecorator(PeopleComponent component) {        super(component);    }    @Override    public void action() {        if(people.getGender().equals(Gender.Man)){            System.out.println("The man is handsome!");        }else{            System.out.println("This woman is charming!");        }    }    @Override    public void show() {        component.show();        action();    }}

package com.git.books.b_design_patterns.i_decorator;public enum Gender {    Man,Woman}

package com.git.books.b_design_patterns.i_decorator;/** *  * @Description: 装饰模式测试类 * @author: songqinghu * @date: 2017年3月4日 下午3:53:58 * Version:1.0 */public class TheDecoratorTest {    public static void main(String[] args) {        People people = new People();        people.setName("Coco");        people.setAge(19);        people.setGender(Gender.Woman);        PeopleComponent peopleComponent = new PeopleConcrete(people);        peopleComponent =new ClothesDecorator(new PantsDecorator(new  PraiseDecorator(peopleComponent)));        peopleComponent.show();    }}

运行结果:Coco put on a beautiful dressCoco put on a beautiful pants my name : Coco, age :19, gender : Woman This woman is charming!

结构图:


重点:
理解如何进行包装.

参考:
<<设计模式>>
<<Java与模式>>


0 0