装饰设计模式就是对已有的对象的功能进行增强
当想要对已有的对象进行功能增强时,
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
例如:你有个对象有个功能 是在N年前建立的,如今你觉得功能不够用了 写个类把对象传进来就可以解决问题了 如果这个功能写错了 我就把自己写的功能去掉又不影响以前的功能灵活性相当强的。
装饰模式比继承要灵活。避免了继承体系臃肿。
而且降低了类于类之间的关系。
装饰类因为增强已有对象,具备的功能和已有的是相同的,只不过提供了更强功能。
所以装饰类和被装饰类通常是都属于一个体系中的。
1 package com.gh.decorator; 2 /** 3 * 具体的装饰者对象:黑豆; 4 * @author ganhang 5 * 6 */ 7 public class BlackBeanDecorator extends Decorator{ 8 9 public BlackBeanDecorator(Drink drink) { 10 super(drink); 11 } 12 @Override 13 public String description() { 14 return super.description()+"+黑豆"; 15 } 16 @Override 17 public int cost() { 18 return super.cost()+2; 19 } 20 }
package com.gh.decorator; /** * 装饰者父(基)类 * @author ganhang * */ public abstract class Decorator implements Drink{ private Drink drink; public Decorator(Drink drink) { this.drink=drink; } @Override public String description() { return drink.description(); } @Override public int cost() { return drink.cost(); } }
package com.gh.decorator; /** * 被装饰者对象的接口 * @author ganhang * */ public interface Drink { //饮料的介绍 public String description(); //饮料的价格 public int cost(); }
package com.gh.decorator; /** * 具体的装饰者:鸡蛋; * @author ganhang * */ public class EggDecorator extends Decorator{ public EggDecorator(Drink drink) { super(drink); } @Override public String description() { return super.description()+"+鸡蛋"; } @Override public int cost() { return super.cost()+3; } }
package com.gh.decorator; /** * 具体的装饰者对象:纯豆浆; * @author ganhang * */ public class SoyaBeanMilk implements Drink{ @Override public String description() { return "纯豆浆"; } @Override public int cost() { return 5; } }
1 package com.gh.decorator; 2 3 /** 4 * 具体的装饰者对象:糖; 5 * 6 * @author ganhang 7 * 8 */ 9 public class SugarDecorator extends Decorator { 10 11 public SugarDecorator(Drink drink) { 12 super(drink); 13 } 14 15 @Override 16 public String description() { 17 return super.description() + "+糖"; 18 } 19 20 @Override 21 public int cost() { 22 return super.cost()+1; 23 } 24 }
1 package com.gh.decorator; 2 3 public class test { 4 public static void main(String[] args) { 5 //生产一杯豆浆 6 Drink soya=new SoyaBeanMilk(); 7 //豆浆里加鸡蛋 8 EggDecorator eggsoya=new EggDecorator(soya); 9 //加了鸡蛋的豆浆里加糖 10 SugarDecorator sugarEggSoya=new SugarDecorator(eggsoya); 11 //再加个黑豆。。。 12 BlackBeanDecorator blackBeanSugarEggSoya=new BlackBeanDecorator(sugarEggSoya); 13 //输出描述 14 System.out.println(blackBeanSugarEggSoya.description()); 15 //输出价格 16 System.out.println("价格是:"+blackBeanSugarEggSoya.cost()); 17 18 } 19 }
刚好看了个视频 关于装饰设计模式 觉得挺精辟的就保留了下来
什么是装饰设计模式:
当想要对已有的对象进行功能增强时,
可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。
那么自定义的该类称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象。
并基于被装饰的对象的功能,提供更强的功能。
如一个简单的demo 人吃饭,刚开始人穷只是普通的吃饭后来人生活好了吃饭就不一样了增强了吃饭的功能 虽然例子不是恰当 能说明问题就行
看代码:
- //穷的时候吃饭简简单单的吃饭
- class Person
- {
- public void chiFan(){
- System.out.println("吃饭");
- }
- }
- //富裕后吃饭 吃饭前来杯酒吃饭后来根烟 但是这中间的过程还是有吃饭
- class SuperPerson
- {
- private Person p;
- public SuperPerson(Person p){
- this.p=p;
- }
- public void superChiFan(){
- //吃饭前来杯开胃酒增加食量
- System.out.println("开胃酒");
- p.chiFan();
- //吃完饭后来根烟
- System.out.println("来根烟");
- }
- }
- public class PersonDemo
- { public static void main(String args[]){
- Person p=new Person();
- SuperPerson sp= new SuperPerson(p);
- sp.superChiFan();
- }
- }
以上只是简单说明一下,在JAVA IO中用了很多增强 如:FileRead中read()方法 只是一个一个字节去读,为了读得更快在BufferedReader就增强了read()方法而产生了reandLine()一行一行的去读
有人说没必要那么麻烦:你只要拿superPerson继承person 在覆写person的chiFan()方法不就行了?
装饰是构造函数参数传递进行增强
如果为了某个功能而产生子类(继承)那么那个体系是非常臃肿的