三、装饰模式
1 装饰模式?
动态的给一个对象添加一些额外的职能,就增加功能来说,装饰模式比生成子类更加灵活。就本例来说,一个对象是Person,通过装饰类添加“职责”,生成不同的装饰子类去具体的装饰。
2 装饰模式应用?
当系统需要新增功能的时候,想旧的类中增加代码,完成新的“装饰”。
3 第一个例子中,只额外的增加一个功能类Finery(装饰类),也可以继续在原有的基础上增加,比如增加游玩类,然后再增加具体的游玩类的实现类去做更具体的装饰。这样,就把Person类的核心功能和装饰功能独立开来。就是把类的装饰功能从类中搬移出去,这样可以简化原有的类。第二个例子,共有两个类去装饰Person。
4 装饰着模式的意义?
就是为了简化核心类的设计,让核心功能实现在核心类中完成。把核心类的一些额外功能移除出去,去做单独的类,完成对核心类的装饰。
装饰者模式存在一个对象链。
代码如下:
package com.biao.text.demo1; /*装饰着模式,就是动态的生成一个对象链,实现装饰。*/ public class Decorate { public static void main(String[] args) { Person person = new Person("cong"); Finery finery = new Finery(); ConcreteA concreteA = new ConcreteA(); ConcreteB concreteB = new ConcreteB(); ConcreteC concreteC = new ConcreteC(); /*开始装饰*/ finery.decorate(person); concreteA.decorate(finery); concreteB.decorate(concreteA); concreteC.decorate(concreteB); concreteC.show(); } } /*首先创建被装饰的对象*/ class Person{ private String name; public Person() { // TODO Auto-generated constructor stub } public Person(String name) { this.name = name; } public void show(){ System.out.println("装饰的"+name); } } /*创建装饰Person的类,该类中要维护一个Person的引用。*/ class Finery extends Person{ private Person person; public void decorate(Person person){ this.person = person; } @Override public void show() { // TODO Auto-generated method stub if(person != null){ person.show(); } // super.show(); } } /*更具体的装饰类的子类,实现更具体的装饰*/ class ConcreteA extends Finery{ @Override public void show() { // TODO Auto-generated method stub System.out.println("日韩裤"); super.show(); } } class ConcreteB extends Finery{ @Override public void show() { // TODO Auto-generated method stub System.out.println("皮鞋"); super.show(); } } class ConcreteC extends Finery{ @Override public void show() { // TODO Auto-generated method stub System.out.println("帽子"); super.show(); } }
如果增加两个额外的功能,用什么衣服装饰+喜欢去哪些地方玩(还可以对核心类Person进行更多功能的附加)
《总结:继承核心类,编写自己的子类,去完成装饰》
package com.biao.text.demo1; /*装饰着模式,就是动态的生成一个对象链,实现装饰。*/ public class Decorate { public static void main(String[] args) { Person person = new Person("cong"); Finery finery = new Finery(); ConcreteA concreteA = new ConcreteA(); ConcreteB concreteB = new ConcreteB(); ConcreteC concreteC = new ConcreteC(); /*第一功能装饰*/ finery.decorate(person); concreteA.decorate(finery); concreteB.decorate(concreteA); concreteC.decorate(concreteB); /*第二功能装饰*/ Play play = new Play(); Play1 play1 = new Play1(); Play2 play2 = new Play2(); play.decorate(person); play1.decorate(play); play2.decorate(play1); concreteC.showfunction1(); play2.showfunction2(); } } /*首先创建被装饰的对象*/ class Person{ private String name;//对应一个装饰类 private String place;//继续增加额外功能,在加入一个装饰 public Person() { // TODO Auto-generated constructor stub } public Person(String name) { this.name = name; } public void showfunction1(){ System.out.println("装饰的"+name); } public void showfunction2(){ System.out.println("是我喜欢去的地方"); } } /*创建装饰Person的类,该类中要维护一个Person的引用。*/ class Finery extends Person{ private Person person; public void decorate(Person person){ this.person = person; } @Override public void showfunction1() { // TODO Auto-generated method stub if(person != null){ person.showfunction1(); } // super.show(); } } /*更具体的装饰类的子类,实现更具体的装饰*/ class ConcreteA extends Finery{ @Override public void showfunction1() { // TODO Auto-generated method stub System.out.println("日韩裤"); super.showfunction1(); } } class ConcreteB extends Finery{ @Override public void showfunction1() { // TODO Auto-generated method stub System.out.println("皮鞋"); super.showfunction1(); } } class ConcreteC extends Finery{ @Override public void showfunction1() { // TODO Auto-generated method stub System.out.println("帽子"); super.showfunction1(); } } class Play extends Person{ private Person person; public void decorate(Person person){ this.person = person; } public void showfunction2(){ if(person != null){ person.showfunction2(); } } } class Play1 extends Play{ @Override public void showfunction2() { // TODO Auto-generated method stub System.out.println("北京"); super.showfunction2(); } } class Play2 extends Play{ @Override public void showfunction2() { // TODO Auto-generated method stub System.out.println("上海"); super.showfunction2(); } } //程序运行结果 帽子 皮鞋 日韩裤 装饰的cong 去上海玩 去北京玩 是我喜欢去的地方