Decrator模式
通过继承,使得java所能表达的业务模式迅速扩展。但同时带来另外一个问题。继承使得维护这些父类与子类的关系变得越来越复杂。decrator正是包装已有的业务类而不用再继承一个业务类的典范。 通过在类的层次结构中创建一个平级类或者父级类来减少继承的使用。 我们可以用下面的一个例子来理解包装器模式:
我们可以认为房子是一个概念的东西。它有居住的动能。 基于这个概念, 我造了我自己的房子。这个房子给我住!现在经济条件好了,自然居住的要求也高了。 要求对房子进行装饰。对于这样的需求,我们可以有两种解决办法。
办法一:继承我的房子这个类, 比如我的装修的房子。 在这个房子里, 我可以插点话。 可以挂一些画。
办法二:使用decrator类。
decrator首先也得是房子, 也能住人(继承或实现house)
decrator能提供我高需求的居住条件。 我可以把我的房子拿过来, 然后对这个房子插花,对这个房子挂画。(做额外的事情)
decrator装饰不是别人的房子而是我自己的房子。 (有实体类的引用)
以下是实现的代码:
House接口
package com.rxyu.decrator; public interface House { public void live(); }
MyHouse类
package com.rxyu.decrator; public class MyHouse implements House{ private String owner; public MyHouse(String owner){ this.owner=owner; } public void live(){ System.out.println(owner+"'s House!"); } }
MyDecrator类
package com.rxyu.decrator; import java.util.ArrayList; import java.util.Iterator; public class MyDecrator implements House { private House house; private ArrayList<String> taskList=new ArrayList<String>(); public MyDecrator(House house){ this.house=house; taskList.add("has flower"); taskList.add("has Painting"); } public void live(){ house.live(); otherlive(); } public void otherlive(){ Iterator it=taskList.iterator(); while(it.hasNext()){ System.out.println(it.next()); } } }
测试代码:
package com.rxyu.decrator; public class TestDecrator { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MyHouse robinHouse=new MyHouse("Robin"); MyDecrator md=new MyDecrator(robinHouse); md.live(); } }