初探开发者模型——Decrator模型

何为Decorator模式(装饰者模式)?

    Decorator 模式是一种运用接口、抽象类等技术来给一个对象动态宽展一些额外的使命的方法。

    Decorator模式与一般的实现接口、继承是否一样?不一样又有那些区别?

    Decorator模式是利用接口、继承的方式来实现的,但是与一般的实现接口、继承还是有区别的:

  1. Decorator 模式比一般的实现接口、继承等方法坑具有灵活性;
  2. Decorator 模式是一中动态的扩大父类的方法;
  3. Decoraor 模式与一般的实现接口、继承方式相比,没有了一般的方式的编码复杂混乱,而且更不容易引起遗漏一些属性方法之类的;
  4. 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

猜你喜欢

转载自gaosililin.iteye.com/blog/2203707