JAVA设计模式之装饰者模式

标签: java 设计模式 装饰者模式
4人阅读 评论(0) 收藏 举报
分类:

    装饰者模式,简单的说就是动态的将“职责”添加到已有的对象中,实现功能的拓展。在装饰者模式中,新建子类,不断的继承父类,并添加的新的属性,在新的子类中,需要将当前父类的对象传递进去才会实现,既有之前父类拥有的“职责”,也有新建的“职责”。

    简单的举个例子:我想要个女朋友,这个时候表达出来的只有一个属性,女的。光是女的还不够,我还想是一个美国女孩,现在就多了一个属性,美国的。美国的女孩有什么特点呢?金发!现在又多了一个属性,金发。西方人一般都比东方人高大一点。所以再添加一个高大的属性。那么现在就是这个情况“女孩 + 美国的 + 金发 + 高大”。下面我们通过一个列子,来体现出动态添加属性,也就是装饰者模式。

    首先创建一个抽象类Girl

public abstract class Girl {
	String description = "no description";
	public String getDescription() {
		return description;
	}
}
    女孩有了,现在需要的是一个美国女孩
public class AmericanGirl extends Girl{
	public AmericanGirl() {
		description = "+ AmericanGirl";
	}
}

    为了对比,我们再创建一个国产妹子

public class ChineseGirl extends Girl {
	public ChineseGirl() {
		description = "+ ChineseGirl";
	}
}

    接下来,就是装饰者了,这个装饰者继承了Girl这个抽象类,后面为女孩添加属性的时候,就继承这个装饰者,就有女孩这个属性了。

public abstract class GirlDecorator extends Girl{
	public abstract String getDescription();
}

    有了美国女孩,我们再为她添加上金发,注意看这儿的代码,在类中,创建了一个Girl,并且在构造方法中,实现赋值了,这就说明我们在使用的时候,需要传递一个Girl对象进来,这个Girl对象拥有之前的数属性,传递进来后,我们就在这里面动态的添加新的属性,比如说金发。

public class GoldenHair extends GirlDecorator {

	private Girl girl;
	public GoldenHair(Girl g) {
		girl = g;
	}
	public String getDescription() {
		return girl.getDescription() + " + with golde hair";
	}
}

    还有最后一个属性,身材高大.....这个类和上一个金发的一样,只是我们添加的属性不同。

public class Tall extends GirlDecorator{
	private Girl girl;
	public Tall(Girl g) {
		girl = g;
	}
	@Override
	public String getDescription() {
		// TODO Auto-generated method stub
		return girl.getDescription() + "+ is tall";
	}
	
} 

    现在到最后一步,我们来测试一下。

public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Girl g1 = new AmericanGirl();
		System.err.println(g1.getDescription());
		GoldenHair g2 = new GoldenHair(g1);
		System.out.println(g2.getDescription());
		Tall g3 = new Tall(g2);
		System.out.println(g3.getDescription());
	}

}

    观察代码,我们首先创建了一个父类引用的子对象,这里创建一个Gril对象是为了方便后面的使用。接着是创建一个金发的女孩,但是金发的女孩是美国的,就将之前创建的美国女孩作为参数传递进去,那么现在就是“美国+金发”了。最后同样的道理,我们为她添加身材高大的属性,这样就有了“美国 + 金发 + 高大”的女孩了。

    装饰者模式的重点就是:在构造方法中将已有的父类对象传递进去,传递进去后,依旧拥有父类的属性或者职责,然后再在新的子类中,添加的新的属性。

    以上只是我个人的理解,如果发现有不对的地方清指出,谢谢。

查看评论

PHP+Javascript液晶时钟

作者:caocao   发表日期:2000年12月20日   阅读次数:126  $size_small=5;//液晶宽度   $size_big=25;//液晶长度   $distance=10;/...
  • terrywang
  • terrywang
  • 2000-12-21 23:24:00
  • 518

Java:一夜一发设计模式(一)------装饰者模式

一,什么时候使用装饰者模式?比如有一家店卖饮品,饮品就有不少种,每一种还可以加项,比如给可乐加冰,加糖,兑水什么的,每次加项的价格还不同,就会将代码弄的很繁琐,这种情况下就可以使用装饰者模式来实现. ...
  • android_zyf
  • android_zyf
  • 2017-03-30 01:53:36
  • 749

学习、探究Java设计模式——装饰者模式

定义装饰者模式:在不改变原类文件以及不使用继承的情况下,动态地将责任附加到对象上,从而实现动态拓展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。设计原则要使用装饰者模式,需要满...
  • a553181867
  • a553181867
  • 2016-08-03 22:52:44
  • 5493

Java 设计模式 装饰者模式

装饰者模式 在设计的时候,往往要给一个对象的功能进行一些修饰,对功能进行拓展和增强,以满足我们的需求。    举个例子,最近流行歌曲比赛,什么《中国好声音》,《中国好歌曲》什么的,对于一个参赛者而言...
  • u010349169
  • u010349169
  • 2014-02-09 23:57:08
  • 6226

JAVA设计模式初探之装饰者模式

这个模式花费了挺长时间,开始有点难理解,其实就是 定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。 设计初衷:通常...
  • jason0539
  • jason0539
  • 2014-04-01 09:07:37
  • 79482

Java设计模式-装饰者模式

模拟穿衣服场景我们来看下面一个具体的案例:每个人一天起床之后都要穿衣服(来装饰自己),这是必不可少的,这样问题就来了,穿什么?按照什么顺序穿? 如何用程序方便的模拟这个场景的,代码如下:/** *...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2015-09-06 09:53:13
  • 2253

深入浅出设计模式之装饰者模式、工厂模式

装饰着模式
  • u011531613
  • u011531613
  • 2017-03-22 19:50:32
  • 452

Head First设计模式:(三)装饰者模式

星巴兹咖啡准备更新订单系统,以合乎他们的饮料供应需求。 他们原先的类设计为: 这样的订单系统没有办法考虑到咖啡调料的部分,把加入不同调料的咖啡看做不同的类会导致类爆炸(每个类的cost方法计算...
  • lissdy
  • lissdy
  • 2012-05-06 19:31:09
  • 3155

《java与设计模式》之装饰模式详解&Java IO中的装饰器模式

1 概述 在一个项目中,你会有非常多的因素考虑不到,特别是业务的变更,不时的冒出一个需求是很正常的情况。有三个继承关系的类:Father、Son、GrandSon,我们要在Son类上增强一些功能怎么办...
  • chs0113
  • chs0113
  • 2016-05-06 19:42:19
  • 9172

设计模式 装饰者模式 带你重回传奇世界

今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义。 装饰者模式:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。 先简单描述下装饰者模式发挥作用的地方,当我...
  • lmj623565791
  • lmj623565791
  • 2014-04-21 20:21:43
  • 18287
    个人资料
    持之以恒
    等级:
    访问量: 1002
    积分: 149
    排名: 113万+
    文章分类
    文章存档