设计模式-装饰者模式

设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代 码可靠性。 

装饰者模式:在java io这一块应用的比较多。如图:

设计模式-装饰者模式_第1张图片

假设一块蛋糕,是草莓奶油巧克力蛋糕,代码如下:


public class StrawberryMilkChocolateCake implements Cake{
	public float cost() {
		float strawberryPrice = 4f;	//草莓价格 
		float chocolate	= 15f;	//巧克力价格 
		return	100 + strawberryPrice + chocolate;	
	}

}
会出现什么问题。。。


比如:换个不同类型的蛋糕,草莓的价格如果改变了,那么就需要改变里面用到草莓的所有的类。如果需要一个新品种的蛋糕的话,就需要去写一个新的类。

装饰者模式:动态地将责任(行为)附加到对象上,如要扩展功能,装饰者提供了比继承更有弹性的替代方案。(虽然继承可以解决这种问题,但是不是一种很好的方案)

下面就用装饰者模式解决这种问题:

1.首先创建cake接口

public interface Cake {
	public float cost();
}
2.假设所有的蛋糕都是有奶油的。创建Milkcake


public class MilkCake implements Cake{

	public float cost() {
		return 100f;
	}


} 
3.写一个抽象类CakeDecorator(或者叫做接口),也实现Cake接口,但是什么也不干,这个类有什么用呢?


想一下,在IO中实现序列化,就是标示一下这个类能够序列化。那么在这里,如果是CakeDecorator的子类,那么就属于装饰者类,

public abstract class CakeDecorator implements Cake{
	
}
4.在加一个苹果蛋糕AppleCake


public class AppleCake extends CakeDecorator{
	private Cake cake;
	public AppleCake(Cake cake){
		this.cake=cake;
	}
	public float cost() {
		float applePrice = 5f;//苹果比较贵啊 
		return cake.cost()+applePrice;
	}

}
5.怎么用呢?


public class test {
	public static void main(String[] args) {
		AppleCake ac = new AppleCake(new MilkCake());
		System.out.println(ac.cost());
	}
} 
装饰者模式的优缺点:



  1. 继承属于扩展形式之一,但不见得是弹性最好的最佳方式
  2. 在我们的设计中,应该允许行为可以被扩展,而无需修改现有的代
    码(开闭原则)
  3. 除了继承,使用装饰者模式也可以让我们扩展行为
  4. 装饰者可以在被装饰者的行为前面、后面加上自己的行为,甚至可
    以将被装饰者的行为取代,而达到特定的目的
  5. 装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程
    序变得复杂 



你可能感兴趣的:(设计模式,装饰者模式)