美文网首页
创建者模式

创建者模式

作者: bocsoft | 来源:发表于2019-02-01 16:05 被阅读0次

    创建者模式,是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
    隐藏了复杂对象的创建过程,把复杂对象的创建过程加以抽象,通过子类或者重载的方式,动态的创建具有复合属性的对象。

    package bridge
    
    //Bridge模式基于类的最小设计原则,通过使用封装、聚合及继承等行为让不同的类承担不同的职责。
    //它的主要特点是把抽象(Abstraction)与行为实现(Implementation)分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展
    
    //抽象接口
    type DisplayImpl interface {
        rawOpen() string
        rawPrint() string
        rawClose() string
    }
    
    //字符串展示结构体
    type StringDisplayImpl struct {
        str string
    }
    
    //实现DispalyImpl接口:行为实现
    func (self *StringDisplayImpl) rawOpen() string {
        return self.printLine()
    }
    func (self *StringDisplayImpl) rawPrint() string {
        return "|" + self.str + "|\n"
    }
    
    func (self *StringDisplayImpl) rawClose() string {
        return self.printLine()
    }
    func (self *StringDisplayImpl) printLine() string {
        str := "+"
        for _, _ = range self.str {
            str += string("-")
        }
        str += "+\n"
        return str
    }
    
    //通过聚合实现抽象和行为实现的分离
    type DefaultDisplay struct {
        impl DisplayImpl
    }
    
    func (self *DefaultDisplay) open() string {
        return self.impl.rawOpen()
    }
    func (self *DefaultDisplay) print() string {
        return self.impl.rawPrint()
    }
    
    func (self *DefaultDisplay) close() string {
        return self.impl.rawClose()
    }
    
    func (self *DefaultDisplay) Display() string {
        return self.open() +
            self.print() +
            self.close()
    }
    
    //通过聚合实现抽象和行为实现的分离
    type CountDisplay struct {
        *DefaultDisplay
    }
    
    func (self *CountDisplay) MultiDisplay(num int) string {
        str := self.open()
        for i := 0; i < num; i++ {
            str += self.print()
        }
        str += self.close()
        return str
    }
    
    
    package builder
    
    import "testing"
    
    func TestBuilder(t *testing.T) {
        expect := "# Title\n## String\n- Item1\n- Item2\n\n"
    
        director := Director{&TextBuilder{}}
        result := director.Construct()
    
        if result != expect {
            t.Errorf("Expect result to %s, but %s", result, expect)
        }
    }
    
    
    

    相关文章

      网友评论

          本文标题:创建者模式

          本文链接:https://www.haomeiwen.com/subject/pqedsqtx.html