何为Decorator模式(装饰者模式)?
Decorator 模式是一种运用接口、抽象类等技术来给一个对象动态宽展一些额外的使命的方法。
Decorator模式与一般的实现接口、继承是否一样?不一样又有那些区别?
Decorator模式是利用接口、继承的方式来实现的,但是与一般的实现接口、继承还是有区别的:
- Decorator 模式比一般的实现接口、继承等方法坑具有灵活性;
- Decorator 模式是一中动态的扩大父类的方法;
- Decoraor 模式与一般的实现接口、继承方式相比,没有了一般的方式的编码复杂混乱,而且更不容易引起遗漏一些属性方法之类的;
- Decortor 模式在运行时才装饰,在利用资源上更好。
学个java的人对Decorator模式并不陌生,我们所使用的IO库就是使用了Decorator模式,各种类与方法都是在基类的基础上进行壮装饰,从而是装饰后的类不仅具有基类的方法属性,还可以扩展一下专有的属性方法。
比如说:我们要做一个点餐单系统应用,如果客户能在我们给定的几个套餐中选择,这样的代码还比较容易写。但是现实中何来都的这么规矩的客户与店家?一些客户专门要给你们挑们事,难道点菜不是在预设的集中套餐当中,我们就不让他们点餐成功?都不是店家想要的结果。那么我们就预设客户的各种点餐可能:餐馆有N 道菜。用一般的继承、实现接口编码,估计码工非得把设计者给干掉不可。就算一道菜只一份就得2的N次的可能,就得2的N次方的个类,更何况有的菜顾客可能点不知一份的情况。码农连说梦话都会把设计的那帮家伙的祖宗妻小都问过遍了。而用Decorator模式就大量地减少编码的负担了,N个扩展类就可以轻松完成了。
简单实例
/** * 饼类老大(原型) * @author gaosi * */ public interface Cake { public String decripation(); public double price(); }
public class CrashpingCake implements Cake { @Override public String decripation() { return "原型"; } @Override public double price() { return 4.0; } }
/** * 装饰的抽象类 * @author gaosi * */ public abstract class Decrator implements Cake { private Cake cake; public Decrator(Cake cake) { this.cake = cake; } @Override public String decripation() { return cake.decripation(); } @Override public double price() { return cake.price(); } }
public class BeefDecrator extends Decrator { public BeefDecrator(Cake cake) { super(cake); } @Override public String decripation() { return super.decripation()+"+牛肉"; } @Override public double price() { return super.price()+3; } public void requirements() { System.out.println("牛肉三分熟"); } }
public class EggDecrator extends Decrator { public EggDecrator(Cake cake) { super(cake); } @Override public String decripation() { return super.decripation()+"+鸡蛋"; } @Override public double price() { return super.price()+1.5; } }
public class Test { /** * 初探开发者模式---Decorator 模式(装饰者模式) * @param args */ public static void main(String[] args) { CrashpingCake cc = new CrashpingCake();//被装饰的原型 BeefDecrator bd = new BeefDecrator(cc); EggDecrator ed = new EggDecrator(cc); EggDecrator ed1 = new EggDecrator(bd); EggDecrator ed2 = new EggDecrator(ed); System.out.println("点餐:"+bd.decripation()); System.out.println("共需钱"+bd.price()); System.out.println("点餐:"+ed.decripation()); System.out.println("共需钱"+ed.price()); System.out.println("点餐:"+ed1.decripation()); System.out.println("共需钱"+ed1.price()); System.out.println("点餐:"+ed2.decripation()); System.out.println("共需钱"+ed2.price()); } }
点餐:原型+牛肉 共需钱7.0 点餐:原型+鸡蛋 共需钱5.5 点餐:原型+牛肉+鸡蛋 共需钱8.5 点餐:原型+鸡蛋+鸡蛋 共需钱7.0