装饰者模式
发布日期:2021-09-25 11:48:13 浏览次数:2 分类:技术文章

本文共 4849 字,大约阅读时间需要 16 分钟。

例子:一个可以给人搭配不同服饰的系统,即可以换各种各样的衣服裤子的个人形象系统

最先想到的是,先建一个Person类

package deractor;public class Person {	private String name;	public Person(String name){		this.name=name;	}	public void show(){		System.out.println("装扮"+name);	}}

各种服饰的抽象类

package deractor;abstract class Finery {	public abstract void Show();}

服饰子类

package deractor;public class TShirts extends Finery{	@Override	public void Show() {		// TODO Auto-generated method stub		System.out.println("大T恤");	}}
package deractor;public class BigTrouser extends Finery{	@Override	public void Show() {		// TODO Auto-generated method stub		System.out.println("垮裤");	}}
package deractor;public class WearSneakers extends Finery{	@Override	public void Show() {		// TODO Auto-generated method stub		System.out.println("破球鞋");	}}
package deractor;public class WearSuit extends Finery{	@Override	public void Show() {		// TODO Auto-generated method stub		System.out.println("西装");	}	}

测试代码

package deractor;public class Test {	public static void main(String[] args) {		// TODO Auto-generated method stub		Person test=new Person("Autumn");		System.out.println("装扮如下");		Finery ts=new TShirts();		Finery bt=new BigTrouser();		Finery ws=new WearSneakers();		Finery wsuit=new WearSuit();		ts.Show();		bt.Show();		ws.Show();		wsuit.Show();	}}

Test中,把“大T恤”、“垮裤”、“破球鞋”、“西装”一个一个进行显示,好比:你光着身子,当着大家的面,一件一件穿上衣服,so,应该在内部组装完毕

即装饰模式Decorator,动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

其中,Component定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent定义了一个具体的对象,也可以给这个对象添加一些职责。Decorator装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,无需知道Decorator的存在,至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。基本代码实现如下:

package deractor;abstract class Component {	public abstract void Operation();}
package deractor;public class ConcreteComponent extends Component{	@Override	public void Operation() {		// TODO Auto-generated method stub		System.out.println("具体的操作对象");	}}
package deractor;abstract class Decorator extends Component{	protected Component component;	public void setComponent(Component component){		this.component=component;	}//	重写Operation,实际执行的是Component的Operation	public void Operation(){		if(component!=null){			component.Operation();		}	}}
package deractor;public class ConcreteDecoratorA extends Decorator{	private String addedState;	public void Operation(){		super.Operation();//首先运行原Operation,再执行本类的功能,如addedState,相当于对原Component进行了装饰		addedState="new state";		System.out.println("具体装饰对象A的操作");	}}
package deractor;public class ConcreteDecoratorB extends Decorator{	public void Operation(){		super.Operation();		AddedBehavior();		System.out.println("具体装饰对象B的操作");	}	private void AddedBehavior(){			}}

装饰的方法是:先用ConcreteComponent实例化对象c,然后用ConcreteDecoratorA的实例化对象d1来包装c,再用ConcreteDecoratorB的对象d2包装d1,最终执行d2的Operation

package deractor;public class DeTest {	public static void main(String[] args) {		// TODO Auto-generated method stub		ConcreteComponent c=new ConcreteComponent();		ConcreteDecoratorA d1=new ConcreteDecoratorA();		ConcreteDecoratorB d2=new ConcreteDecoratorB();				d1.setComponent(c);		d2.setComponent(d1);		d2.Operation();	}}

如果只有一个ConcreteComponent类而没有抽象的Component类,那么Decorator类可以是ConcreteComponent的一个子类,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而是可以把Decorator和ConcreteDecorator的责任合并成一个类

将上述衣服搭配稍作修改

package deractor;public class PersonConcreteComponent {	private String name;	public PersonConcreteComponent(){}	public PersonConcreteComponent(String name){		this.name=name;	}	public void Show(){		System.out.println("装扮的"+name);	}}
package deractor;public class FineryDecorator extends PersonConcreteComponent{	protected PersonConcreteComponent component;		public void Decorate(PersonConcreteComponent component){		this.component=component;	}	public void Show(){		if(component!=null){			component.Show();		}	}}
package deractor;public class TShirts2 extends FineryDecorator{	@Override	public void Show() {		// TODO Auto-generated method stub			super.Show();		System.out.println("大T恤");	}}
package deractor;public class WearSneakers2 extends FineryDecorator{	@Override	public void Show() {		// TODO Auto-generated method stub		super.Show();		System.out.println("破球鞋");	}}
package deractor;public class BigTrouser2 extends FineryDecorator{	@Override	public void Show() {		// TODO Auto-generated method stub		super.Show();		System.out.println("垮裤");	}}
package deractor;public class DecorateTest {	public static void main(String[] args) {		// TODO Auto-generated method stub		PersonConcreteComponent person=new PersonConcreteComponent("Autumn");		System.out.println("the following装扮");				TShirts2 ts=new TShirts2();		BigTrouser2 bt=new BigTrouser2();		WearSneakers2 ws=new WearSneakers2();				ts.Decorate(person);		bt.Decorate(ts);		ws.Decorate(bt);        ws.Show();	}}

运行结果:

the following装扮装扮的Autumn大T恤垮裤破球鞋
由此可以看出,装饰模式把每个要装饰的功能放在单独的类中,并让这个类包装它索要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象。

转载地址:https://blog.csdn.net/Autumn03/article/details/80745948 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:代理模式
下一篇:策略模式

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年03月31日 02时43分18秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

《华尔街之狼》精髓:摔倒并不是坏事,就怕你因此放弃。 2019-04-26
《微观动机与宏观行为》精髓:个人的微观动机,是如何影响宏观行为结果的? 2019-04-26
《国富论》精髓:亚当·斯密提出的对后世影响深远的三个经济学理论:劳动分工理论、生产要素理论和宏观调控理论 2019-04-26
《动荡的世界》精髓:什么是动物精神?动物精神又是怎么影响2008年全球经济危机的,以及我们该如何预防动物精神,避免危机再次发生。 2019-04-26
《投资最重要的事》精髓:利用逆向思维,掌握既冷静又勇猛的投资方法,成为投资界真正厉害的人。 2019-04-26
《周期》书中的精髓:如何利用周期,掌握世界的发展趋势,实现财富积累。 2019-04-26
《伟大的博弈》书中的精髓:华尔街是如何从一条小街,一步步发展为世界金融中心的。 2019-04-26
《逃不开的经济周期》书中的精髓:经济周期是推动创新变革和经济增长以及复兴的关键力量。 2019-04-26
《朋友还是对手》书中的精髓:奥地利学派和芝加哥学派两派共识远多于分歧,两派首先是朋友,其次才是对手。 2019-04-26
《动物精神》书中的精髓:人类的非理性面影响经济决策,这些有可能是金融危机的根源。 2019-04-26
《赢家的诅咒》书中的精髓:人性的复杂让主流经济学出现了诸多失灵,如何用更多理论完善经济学大厦是经济学家的重要使命 2019-04-26
《巴菲特法则》书中的精髓:用好巴菲特企业前景投资法则,股票投资稳赚不赔。 2019-04-26
《战胜华尔街》书中的精髓:业余投资者如何根据行业特点选好股票,赚得比专业的投资者还要多? 2019-04-26
《巴菲特的估值逻辑》书中的精髓:在投资过程中不断总结经验,不断提升投资能力,不断探索、加深对好公司的理解,成就了巴菲特的投资神话。 2019-04-26
《股市稳赚》书中的精髓:用简单的神奇公式进行股票投资,获得稳定而持久的收益。 2019-04-26
《曾国藩的经济课》书中的精髓:我们如何像曾国藩一样,在遇到道德和环境冲突时,既能保持自己的道德,又能调动资源,帮助自己成事。 2019-04-26
《富人的逻辑》书中的精髓:为什么暴富起来的人会在短期内失去财富,我们又该如何去创造财富和持续拥有财富。 2019-04-26
作文提升~老师整理的优美比喻句太实用 2019-04-26
作文提升~老师整理的优美拟人句太实用 2019-04-26
作文提升~老师整理的优美排比句太实用 2019-04-26