帮你整理了一份设计模式速查手册 (6)

客户端使用像下面这样

Composite root = new Composite("root");
root.Add(new Leaf("Leaf A"));
root.Add(new Leaf("Leaf B"));
Composite comp = new Composite("Composite X");
comp.Add(new Leaf("Leaf XA"));
comp.Add(new Leaf("Leaf XB"));
root.Add(comp);
Composite comp2 = new Composite("Composite XY");
comp2.Add(new Leaf("Leaf XYA"));
comp2.Add(new Leaf("Leaf XYB"));
comp.Add(comp2);
root.Add(new Leaf("Leaf C"));
root.Display(1);

帮你整理了一份设计模式速查手册

或者像公司体系结构这种当需求中体现部分整体层次结构,以及你希望用户可以忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象时,考虑使用组合模式。上面例子中客户端无需关心处理一个叶节点还是枝节点组合组件,都用统一方式访问。

5、Flyweight 享元

享元模式主要用于减少对象的数量,以减少内存占用和提供性能。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。像棋盘中的棋子,不可能创建一整个所有的棋子对象。所以它主要解决当需要大量的对象,有可能对内存造成溢出,我们可以把共同的部分抽象出来,这样如果有相同的业务请求,直接返回内存中已有的对象,不去重复创建了。

帮你整理了一份设计模式速查手册

 核心就是用一个字典存储这些需要重复使用的对象。

通过上面结构图可以看见就是把Flyweight享元类聚合到FlyweightFactory享元工厂中,享元工厂中用一个Hashtable存储这些具体的享元类。

class FlyweightFactory
{

    private Hashtable flyweights = new Hashtable();
    public FlyweightFactory()
    
{
        flyweights.Add("X"new ConcreateFlyweight);
        flyweights.Add("Y"new ConcreateFlyweight);
    }

    public Flyweight GetFlyweight(string key)
    
{
        return (Flyweight)flyweights[key];
    }
}

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdydg.html