装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
优点:把类中的装饰功能从类中搬移去除,这样可以简化原有的类。可以有效地把类的核心职责和装饰功能区分开,而且可以去除相关类中重复的装饰逻辑。
使用场景:为已有功能动态地添加更多功能的一种方式。
下面以一个小Demo为例讲解:Tshirts(Shoe、Kuzi) extends Finery ,Finery extends Person 。Decorate为测试类
(1)被装饰的类
public class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } public void show(){ System.out.println("装扮的"+name); } }
(2)装饰类
public class Finery extends Person { protected Person mPerson; public void decorate(Person person) { mPerson = person; } @Override public void show() { if (mPerson != null) { mPerson.show(); } } }
(3)具体装饰类Tshirt (Shoe和Kuzi同理)
public class TShirts extends Finery { @Override public void show() { System.out.println("TShirts"); super.show(); } }
(4)测试类
/**装饰者模式*/ public class Decorate { public static void main(String[] args) { Person mPerson = new Person(); mPerson.setName("董永康"); TShirts mTShirts = new TShirts(); Kuzi mKuzi = new Kuzi(); Shoe mShoe = new Shoe(); mTShirts.decorate(mPerson); mKuzi.decorate(mTShirts); mShoe.decorate(mKuzi); mShoe.show(); } }
总结:两层继承关系,Tshirts(Shoe、Kuzi) extends Finery extends Person
。Finery作为连接Person和Tshirts类的“桥梁”,子类show中调用super.show,在装饰的时候传递子类对象,然后调用子类对象的show方法。循环直到结束。这样做使每个装饰对象的实现和如何使用这个对象分离开了。每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中。
时间: 2024-10-29 21:19:37