java设计模式大话之装饰者模式

去年有一部很火的电视剧叫《伪装者》,胡歌、靳东、刘敏涛、王凯领衔主演,收视跟口碑都不错。没看过的小伙伴们可以去看下。


跑题了,聊聊正题装饰着模式:

在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象,是不是有点伪装者的味道。

注意几点:

(1)装饰对象和真实对象有相同接口,这样客户端在用的时候就可以把装饰对象当成真实对象来用,这是实现的关键

(2)装饰者包含一个真实对象的实例的引用。

(3)装饰对象接收所有来自客户端的请求,并把这些请求转发给真实的对象。

(4)装饰者可以在转发这些请求之前或者之后添加一些附加功能,这样就可以在不修改给定对象的结构情况下,附加功能,一般在设计的时候我们都是通过继承来扩展功能,而这种模式不需要子类就能扩展,更加灵活,方便。

类图:


具体实例:

小张的女朋友要过生日了,为了给她一个惊喜,小张特地偷学了做蛋糕的手艺,想自己做一个既美味又漂亮的蛋糕给女朋友,这不他买来了蛋糕面包,奶油,水果,还有一些别的小装饰品准备大干一场了。

public interface ICake
{
   //准备材料
   public void prepair();
   //塑形制做
   public void make(); 
}


//普通的奶油蛋糕
public class NormalCake implements ICake
{
    //准备材料
   public void prepair(){
      System.out.println("正在准备原材料。。。");
   };
   //塑形制做
   public void make(){
     //prepair();
	 System.out.println("普通奶油蛋糕就快要出来了。。");
   } 
}

//小张是个追求浪漫的人,他看着自己做的简单的奶油蛋糕,一看不对,太普通了,一点惊喜都没有,还不如去外面直接买个蛋糕得了
,所以他决定重新做一个巧克力水果蛋糕,并写上女友的名字
创建抽象装饰者:
public abstract class AbstractCake implements ICake
{

   private final ICake cake;
   public AbstractCake(ICake cake){
      this.cake=cake; 
   }
    //准备材料
   public void prepair(){
      this.cake.prepair();
   };
   //塑形制做
   public void make()
   {
      
   } 
}

创建具体装饰者
public class Decorator extends AbstractCake{
	   public Decorator (ICake cake)
	   {
	      super(cake);
	   }
	   
	   public void chocolate()
	   {
	     System.out.println("我开始给蛋糕涂上巧克力");
	   }
	   
	   public void fruit()
	   {
	     System.out.println("我开始给蛋糕放上水果");
	   }
	   
	   public void writeName()
	   {
	     System.out.println("我开始给蛋糕写名字");
	   }
	   
	   public void make()
	   {
		  super.prepair();
	      this.chocolate();
		  this.fruit();
		  this.writeName();
		  super.make();
	   }
	}

最终呈现
public class  Client
{
	  public static void main(String args[]){
	        System.out.println("开始做蛋糕");
			//先做一个普通的奶油蛋糕
			ICake normalcake=new NormalCake();
			//下面就开始进行装饰
			normalcake=new Decorator(normalcake);
			normalcake.make();
			System.out.println("蛋糕好了");
			//装饰结束
	  }
}






运行结果:

总结:

(1)在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。

(2)处理那些可以撤消的职责。

(3)当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的 子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值