设计模式之装饰者模式(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
- 设计模式之Decorator(装饰者模式)
- 设计模式之(Decorator)装饰者模式
- 设计模式之装饰者模式(Decorator)
- 设计模式之装饰者模式Decorator
- 设计模式之Decorator(装饰者)
- 设计模式之:Decorator装饰者
- 设计模式之装饰者-Decorator
- 设计模式之Decorator(装饰者)
- 设计模式之Decorator装饰者设计模式
- Decorator装饰者设计模式
- 设计模式之decorator装饰模式
- 设计模式之-Decorator--装饰器模式
- 设计模式之(三、装饰模式Decorator)
- 设计模式之(九)装饰模式Decorator
- 设计模式之Decorator(装饰模式)
- 设计模式之装饰模式(Decorator Pattern)
- 【设计模式】之 Decorator 装饰模式
- 设计模式之八 --- 装饰模式(Decorator)
- JavaScript图片轮播代码
- Oculus Rift CV1 驱动安装教程(内含Oculus官方Demo)
- Android 消息机制及其源码分析
- EL表达式
- Maven实践(三)---编写主代码
- 设计模式之装饰者模式(Decorator)
- 1.5输入若干个整数,求其最大值、最小值和平均值
- 深入浅出Java入门 之 运算符(2)
- Cookie的传递流程
- 最长回文子串—动态规划和Manacher算法(0(n)时间复杂度
- 17.03.04 字符串
- 二叉树的编号
- 抽象工厂
- 要啥自行车,共享单车都来了