装饰模式--可用或不用,还能自定义

装饰模式,首先可以根据它的名字去理解。

例如这样的一个场景,早起要穿衣服,穿哪一件呢?

你可以T恤加牛仔加拖鞋的屌丝风;

也可以西服领带皮鞋的绅士风;

还能大T恤垮裤破球鞋的嘻哈路线;

。。。。

也就是说,你怎样搭配都可以,可以随性所欲的把某一件衣服和某一件裤子搭配起来。

这样的方式,如果采用简单工厂模式去构造的话,则可能构造出m*n个具体类,也就是全部枚举出来。

当然,真实的意图是,你想穿哪件就穿哪件,“搭配”起来。

当然使用的是这个装饰模式,首先还是给出类图:



如上面类图,其中有一个基础的抽象类Component,该类主要定义一些规范,让子类去具体实现,

而在Decorator类中,就是主要的装饰器,一方面获得一个Component的引用,另一方面继承自Component。

但是Decorator的实现主要是通过Component的具体子类来实现的(例如ConcreteComponent),除此之外,

在Decorator类中还能增加其他的方法,也就想前面例子中的,增加不同的衣服裤子,完全在于自己的Decorator如何写。

下面看具体的类实现代码:

Component类:

package com.blog.anla.Decorator;

/**
 * component是定义一个对象接口,可以给这些
 * 对象动态的添加职责
 * @author U-ANLA
 *
 */
public abstract class Component {
	public abstract void operation();
}


ConcreteComponent类:

package com.blog.anla.Decorator;
/**
 * concretecomponent是定义了一个具体的对象,
 * 也可以给这个对象添加一些职责
 * @author U-ANLA
 *
 */
public class ConcreteComponent extends Component {

	@Override
	public void operation() {
		System.out.println("operation类的具体操作");
	}

}


Derecotor类:

package com.blog.anla.Decorator;
/**
 * 抽象装饰类,集成了component,利用其来
 * 完成component原有的功能,此外还能够添加
 * 其他的功能,从而扩展原来的component的功能
 * @author U-ANLA
 *
 */
public abstract class Decorator extends Component{

	protected Component component;
	
	public void setComponent(Component component) {
		this.component = component;
	}
	
	@Override
	public void operation() {
		if(component != null){
			component.operation();
		}
	}
	
}


ConcreteDecoratorA类:

package com.blog.anla.Decorator;

/**
 * 具体的装饰类A。
 * @author U-ANLA
 *
 */
public class ConcreteDecoratorA extends Decorator{
	private String addedState;  //增加本类独有的功能
	
	@Override
	public void operation(){
		super.operation();
		addedState = "ConcreteDecoratorA";
		System.out.println("具体装饰对象A的操作");
	}
}


ConcreteDecoratorB类:

package com.blog.anla.Decorator;
/**
 * 具体装饰对象B
 * @author U-ANLA
 *
 */
public class ConcreteDecoratorB extends Decorator{
	
	@Override
	public void operation() {
		super.operation();
		anotherBehavior();
		System.out.println("具体装饰对象B的操作");
	}
	
	private void anotherBehavior(){
		System.out.println("I am another behavior!");
	}
}

赠人玫瑰手留余香,如果那里书写有误欢迎提出来哈(oo)












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值