Android的开发之&java23中设计模式------>组合模式

 
 
组合模式
   组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。掌握组合模式的重点是要理解清楚 “部分/整体” 还有 ”单个对象“ 与 "组合对象" 的含义。
组合模式可以让客户端像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。

适用性
     1.你想表示对象的部分-整体层次结构
     2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

public class CompositeMethodActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_composite_method);

        MarketBranch marketBranch=new MarketBranch("总店");
        MarketBranch marketBranch1=new MarketBranch("分店");
        MarketJoin marketJoin=new MarketJoin("分店加盟店");
        MarketJoin marketJoin1=new MarketJoin("分店加盟店2");

        marketBranch1.add(marketJoin);
        marketBranch1.add(marketJoin1);
        marketBranch.add(marketBranch1);
        marketBranch.PayByCard();
    }

    /**
     * 总结
     组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以像处理简单元素一样来处理复杂元素。
     如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择。本章使用了一个文件系统的例子来举例说明了组合模式的用途。在这个例子中,文件和目录都执行相同的接口,这是组合模式的关键。通过执行相同的接口,你就可以用相同的方式对待文件和目录,从而实现将文件或者目录储存为目录的子级元素。
     */
}
/** * 桥接模式 桥接模式是将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或接口(Interface)模式。 */
public class BridgeMethodActivity extends AppCompatActivity {
   
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bridge_method);

        Implementor implementor=new ConcreteImplementorA();
        RefinedAbstraction abstraction=new RefinedAbstraction(implementor);
        abstraction.operation();
        abstraction.otherOperation();
    }
}
 
 
public class ConcreteImplementorB implements Implementor {
    @Override
    public void operationImpl() {
        System.out.print("具体实现B");
    }
}
public abstract class Abstraction {
    //持有一个Implementor对象,形成聚合关系
    protected Implementor implementor;

    public Abstraction(Implementor implementor){
        this.implementor=implementor;
    }

    //可能需要转调实现部分的具体实现
    public void operation(){
        implementor.operationImpl();
    }
}

public interface Implementor {
    //实现抽象部分需要的某些具体功能
    void operationImpl();
}
public class ConcreteImplementorA implements Implementor {
    @Override
    public void operationImpl() {
        System.out.print("具体实现A");
    }
}
public class RefinedAbstraction extends Abstraction {
    public RefinedAbstraction(Implementor implementor) {
        super(implementor);
    }

    public void otherOperation(){
        // 实现一定的功能,可能会使用具体实现部分的实现方法,
        // 但是本方法更大的可能是使用 Abstraction 中定义的方法,
        // 通过组合使用 Abstraction 中定义的方法来完成更多的功能
        System.out.print("其他实现");
    }
}


应用场景
1、如果你不希望在抽象和实现部分采用固定的绑定关系,可以采用桥接模式,来把抽象和实现部分分开,
然后在程序运行期间来动态的设置抽象部分需要用到的具体的实现,还可以动态切换具体的实现。

2、如果出现抽象部分和实现部分都应该可以扩展的情况,可以采用桥接模式,让抽象部分和实现部分可以
独立的变化,从而可以灵活的进行单独扩展,而不是搅在一起,扩展一边会影响到另一边。

3、如果希望实现部分的修改,不会对客户产生影响,可以采用桥接模式,客户是面向抽象的接口在运行,
实现部分的修改,可以独立于抽象部分,也就不会对客户产生影响了,也可以说对客户是透明的。

4、如果采用继承的实现方案,会导致产生很多子类,对于这种情况,可以考虑采用桥接模式,分析功能变
化的原因,看看是否能分离成不同的纬度,然后通过桥接模式来分离它们,从而减少子类的数目。

github地址:https://github.com/zyj18410105150/DesignMode

猜你喜欢

转载自blog.csdn.net/jie1123161402/article/details/78534804