首页 > 代码库 > 设计模式5---装饰模式
设计模式5---装饰模式
问题:人要穿衣服,可以穿鞋子,裤子,领带。。。,顺序可以使随机的。
也就是包含大量随机的操作,但是我们的结果却需要一个明确的顺序去执行这个方法。
UML图:
该方法的变种是,可以Decorate直接继承自RealComponent。
上图的方法可以通过接口来操作,符合开闭原则。
这样所有实现component接口的类都可以使用Decorate类处理。
已穿衣服为例:
component接口:
public interface IComponent { void show();}
具体实现类:
public class Person implements IComponent { private String name; public Person(String name) { this.name = name; } @Override public void show() { System.out.println("穿衣服的"+name); }}
装饰抽象类:
public abstract class Chothes implements IComponent { protected IComponent _mComponent = null; public void show() { if(_mComponent!=null) { _mComponent.show(); } } public void decorate(IComponent comp) { _mComponent = comp; }}
通过decorate方法,可以把其他Chothes 的子类传入。
Chothes装饰功能类:
public class Westernstyleclothes extends Chothes { @Override public void show() { // TODO Auto-generated method stub System.out.print("西装\t"); super.show(); }}
public class Tie extends Chothes { /* (non-Javadoc) * @see com.jayfulmath.designpattern.decorate.Chothes#show() */ @Override public void show() { System.out.print("领带\t"); super.show(); } }
public class Pants extends Chothes { /* (non-Javadoc) * @see com.jayfulmath.designpattern.decorate.Chothes#show() */ @Override public void show() { System.out.print("西裤\t"); super.show(); } }
public class LeatherShoes extends Chothes { /* (non-Javadoc) * @see com.jayfulmath.designpattern.decorate.Chothes#show() */ @Override public void show() { System.out.print("皮鞋\t"); super.show(); } }
main函数:
public class DecorateMain extends BasicExample { @Override public void startDemo() { Person mPerson = new Person("小明"); Westernstyleclothes wl = new Westernstyleclothes(); Pants pt = new Pants(); Tie ti = new Tie(); LeatherShoes ls = new LeatherShoes(); ti.decorate(mPerson); ls.decorate(ti); pt.decorate(ls); wl.decorate(pt); wl.show(); }}
如上,可以任意更换顺序,但不需改变其他代码,即可实现穿衣服流程的变化。
设计模式5---装饰模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。