java设计模式之decoration模式

原创 2013年12月05日 16:32:36

本人近来正在学习研读《head first 设计模式》,有读了知名的博文《最牛B的程序员训练方法》,故想写篇博文,总结一下自己学习设计模式的体会和感悟,不好之处,请多多包涵,如诺指出其中的错误,本人不胜感激。

  设计模式的本源是java开发中面向对象的各种原则,例如依赖倒置原则(DIP),开闭原则(OCP),依赖接口编程(programming to interface)等。但其根本的目的是信息隐藏,和模块化。然后最终的追求便是程序的效用、坚固、和审美。这是设计模式的滥觞所在。

        使用设计模式有什么好处呢?当你在和其他程序员交流时,你使用设计模式的共享语句,其实“不只是”和他人共享“行话”而已。理由如下:

         一:共享模式的词汇“威力强大”。当你使用模式名称和其他开发人员或者开发团队交流时,你们之间交流的不只是模式名称,而是整套模式背后所象征的质量、特性、和约束。

        二:模式能让你使用更少的词做更充分的交流。这对于“少言”的程序员可是一大幸事啊。

        三:设计模式可以让你更专注于“设计圈子”。这样便不会过早的设计底层细节实现的思考。(三条内容摘自《head first 设计模式》)

       《head first 设计模式》中以星巴克咖啡店的自动售货系统为例进行情景设计:顾客购买咖啡时,可以按照其要求在咖啡中加入不同的各种调料,例如:摩卡,豆浆或者覆盖奶泡。系统会根据所加入的调料收取不同的费用。所以不同的咖啡和调料间的自由组合便造成了大量的对象,这会给维护带来极大的麻烦。

       由此出发,我们使用装饰者模式,即动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。其中的细节是:

      一:装饰者和被装饰对象有相同的超类型。

      二:可以使用一个或多个装饰者包装一个对象。

      三:任何需要原始对象(被包装)的场合,可以使用装饰者对象替代它。

      四:装饰者可以在所委托的被装饰者的行为之前或之后,加上自己的行为,已到达特定目的。

      五:装饰者可以包装装饰者,这时的被包装的装饰者一定已经包装了一个被装饰者。

     总体而言,装饰者是避免在类似情节时使用简单继承时产生的大量类对象的维护噩梦而形成的。

     下面是一个例子:

      这是装饰者的超类:

public abstract class 装饰者抽象类 extends 咖啡抽象类{
	public abstract String 咖啡名称();
}
     这是咖啡的超类:

public abstract class 咖啡抽象类 {
	String cfName = "not Name";
	
	public String 咖啡名称(){
		return cfName;
	}
	
	public abstract double 价格();
}

      下边是两个具体装饰者:

public class 装饰A extends 装饰者抽象类{
	
	咖啡抽象类 cf;
	
	public 装饰A(咖啡抽象类 cf){
		this.cf = cf;
	}

	@Override
	public String 咖啡名称() {
		return cf.咖啡名称() + "   装饰A";
	}

	@Override
	public double 价格() {
		return cf.价格() + 123.01;
	}

}

public class 装饰B extends 装饰者抽象类{
	
	咖啡抽象类 cf;
	
	public 装饰B(咖啡抽象类 cf){
		this.cf = cf;
	}

	@Override
	public String 咖啡名称() {
		return cf.咖啡名称() + "   装饰B";
	}

	@Override
	public double 价格() {
		return cf.价格() + 165.01;
	}

}



       这是一个咖啡类:

public class 咖啡种类A extends 咖啡抽象类{
	
	public 咖啡种类A(){
		cfName = "咖啡种类A";
	}

	@Override
	public double 价格() {
		return 10.11;
	}

}
       下面是一个demo:

public class 测试 {
	public static void main(String[] args) {
		咖啡抽象类 c = new 装饰A(new 咖啡种类A());
		
		System.out.println(c.咖啡名称());
		System.out.println(c.价格());
	}
}

       内容便是那么多了,而且多是书上所得。但我自己写给一个例子,感觉咖啡的超类可以不是抽象类,而且在new出相应对象时可以使用另一个模式--工厂模式来实现根据接口编程的原则。


     

     

                          

       

版权声明:本文为博主原创文章,未经博主允许不得转载。

23种设计模式之装饰者模式(Decoration)

装饰者模式 装饰的技巧: 能够在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。 设计原则: 类应该对扩展开放,对修改关闭。 既然装饰者和被装饰对象有相同的超...
  • fanfan4569
  • fanfan4569
  • 2016年07月19日 20:18
  • 175

23种设计模式之装饰者模式(Decoration)

装饰者模式 装饰的技巧: 能够在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。 设计原则: 类应该对扩展开放,对修改关闭。 既然装饰者和被装饰对象有相同的超...
  • fanfan4569
  • fanfan4569
  • 2016年07月19日 20:18
  • 175

设计模式之Facade,Adapter, Proxy

Facade,Adapter,Proxy模式有点类似,功能上都是对调用者提供调用接口,但他们的目的就有些不同。最近正在做一个域名系统,其中就用到了Facade和Adapter模式。正好结合项目来分析下...
  • caoxing81
  • caoxing81
  • 2015年05月30日 09:35
  • 668

IOS中集合视图UICollectionView中DecorationView的简易使用方法

转载自:   http://www.it165.net/pro/html/201312/8575.html Decoration View是UICollectionView的装饰视图...
  • chenyong05314
  • chenyong05314
  • 2015年05月11日 17:38
  • 5666

pytho中的可变参数学习

python中的参数分为很多种,可选参数、必选参数、可变参数等等,最近在使用的时候用到了python的可变参数,起初并不是十分的清楚什么原理,所以专门查了一下可变参数的相关解释,才明白了,可变参数原理...
  • Together_CZ
  • Together_CZ
  • 2017年03月16日 16:54
  • 287

RecyclerView源码详解(第二篇ItemDecoration源码详解)

看源码之前,先看一下ItemDecoration能给我们实现的效果图: 看静态图标记的这条分割线,每个子itemView如果想空开距离或者想产生明显的边界的话,就应该写Ite...
  • xiatiandefeiyu
  • xiatiandefeiyu
  • 2017年10月25日 13:20
  • 90

设计模式经典书籍推荐

很多朋友问学习设计模式的书籍,老大沧浪在FAQ里有个简短的叙述,这里我引申一下,说说自己看过或者翻过的设计模式书籍,由于水平所限,肯定有不对的地方,希望大家指正,如果大家看到好的模式相关书籍,希望能回...
  • a316212802
  • a316212802
  • 2016年03月23日 10:35
  • 11616

java中22种设计模式

设计模式主要分三个类型:创建型、结构型和行为型。 其中创建型有: 一、Singleton,单例模式:保证一个类只有一个实例,并提供一个访问它的全局访问点 二、Abstract F...
  • u012129558
  • u012129558
  • 2016年05月05日 14:47
  • 749

23种设计模式介绍以及在Java中的实现

文本详细总结了23种设计模式以及他们如何应用到java中,并提供了大量的示例代码。 文章中的示例源码在github上:https://github.com/anxpp/JavaDesignPatter...
  • anxpp
  • anxpp
  • 2016年04月24日 01:06
  • 24364

Java开发中的23种设计模式详解

一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模...
  • doymm2008
  • doymm2008
  • 2013年10月28日 09:22
  • 96448
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java设计模式之decoration模式
举报原因:
原因补充:

(最多只允许输入30个字)