炮灰:几个设计模式理解1
几个模式的简单理解,作为炮灰大家轰一轰,看有没有理解错的地方,帮补充补充!
1、代理模式:要求委托第三方来做,要求代理类和被代理类有同样的功能,代理类必须知道代理类有什么功能,他能做些什么事,这就要求统一接口。
2、策略模式:定义三个策略,如果策略相似,请注意统一接口,之后要定义场景,场景提供设置策略方法,执行策略方法。
3、单例模式:方法大部分是private的(只有内部访问),getInstance是static,为了避免多线程,使用synchronized。
4、多例模式:创建多个实例,类似于某个java包下的所有类,都创建实例(for example:一个朝代多个皇帝)。
5、适配器模式:个人认为目的是对一个事物的不同的两个类(A、B)的描述(因为可能是不同系统),为了使用两个类统一,首先使用统一接口,定义个类(适配器,将类重新改造、整合重组)继承B,将原有的信息重组为接口的统一信息。
***接口为了方便可以就把A抽象成接口,当然也可根据具体需求情况自己定义。
6、门面模式:对client端不透明,高内聚松耦合,定义接口,具体动作实现类,门户类,对于门户类可以设置实现类的动作执行顺序等,对client端提供执行的接口。
7、建造者模式:定义建造模式类,建造实现类(设置模式类是如何实现的,例如顺序用List设置等)。可以实现更多级别的实现。
8、原型模式:个人认为,利用原来的原型,创建和原来关系密切,没有太大变化的新类,经常利用Object的cloneable(),复制原型,注意这是浅复制,理解浅复制和深复制[size=medium][/size]。<p><span lang="EN-US"></span>?</p>
<p><span lang="EN-US"></span>?</p>
<p><br><strong>适配器</strong></p>
<p><strong></strong>?</p>
<p>?</p>
<div lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong>建造者模式</strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">Builder?</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong>原型模式:</strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">
<pre name="code" lang="EN-US">假设你写一个文档程序, 里面有一个表单,功能是“从该文件新建”</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">你不是重头来, 你是从当前的文档复制一份,再在上面修改。</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">然后你可以这样:</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">Document newDoc =? new Document();</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">newDoc.setTitle(doc.getTitle());</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">newDoc.setA(doc.getA());</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">newDoc.setB(doc.getB());</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">...很多很多属性</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">其实这个任何可以交给Document, 在Docuemnt类里完成, 类里面可能代码比较复杂,但他不会弄漏,而且清楚复制哪些属性</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">这里只要:</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">Document newDoc = doc.clone(); </span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">//</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">楼主如果初接触模式,可以先不要看《设计模式》这本书,可以先看 《设计模式解析》 或 《Head First Design Pattern》 或者 Bob大叔的《敏捷软件开发,原则,模式与实践》。</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"></span></span></p><p>?</p>
<p>?</p>
<p><br><strong>适配器</strong></p>
<p><strong></strong>?</p>
<p>?</p>
<div lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong>建造者模式</strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">Builder?</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong>原型模式:</strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">个人认为,利用原来的原型,创建和原来关系密切,没有太大变化的新类,经常利用Object的cloneable(),复制原型,注意这是浅复制,理解浅复制和深复制[size=medium][/size]。
<pre></pre>
<p>?</p>
<p>5555555, 前面半句话还有一点点那个味道,后来就离题了。?</p>
</span></span></span></span></p>
<p>?</p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">假设你写一个文档程序, 里面有一个表单,功能是“从该文件新建”</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">你不是重头来, 你是从当前的文档复制一份,再在上面修改。</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">然后你可以这样:</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">Document newDoc =? new Document();</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">newDoc.setTitle(doc.getTitle());</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">newDoc.setA(doc.getA());</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">newDoc.setB(doc.getB());</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">...很多很多属性</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">其实这个任何可以交给Document, 在Docuemnt类里完成, 类里面可能代码比较复杂,但他不会弄漏,而且清楚复制哪些属性</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US"><strong></strong></span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">这里只要:</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">Document newDoc = doc.clone(); </span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">//</span></span></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"></span></span></p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US"><span style="font-size: 9pt;" lang="EN-US">楼主如果初接触模式,可以先不要看《设计模式》这本书,可以先看 《设计模式解析》 或 《Head First Design Pattern》 或者 Bob大叔的《敏捷软件开发,原则,模式与实践》。</span></span></span></span></p>
<p><span lang="EN-US"></span></p>
<p><span lang="EN-US"></span></p>
</div>
<p><br>Object.clone(); 像这种模式是浅复制,如果某个属性是类的话,和原来对象是共享的!我只是想做个标志,怕忘啦!</p>
<p>有些地方确实理解的不到位,非常感谢。十足的炮灰哦!<img src="/images/smiles/icon_biggrin.gif" alt="炮灰:几个设计方式理解1"></p> 7 楼 bencode 2010-01-15 <div class="quote_title">hell_liul 写道</div>
<div class="quote_div">
<div class="quote_title">lujiawu12 写道</div>
<div class="quote_div">实践出真理啊。 <br>我也对23种设计模式做过学习,但是很多讲的虽然明白,但是在实际运用中还是模棱两可的,好多模式都有相似点。没有点实际开发经验感觉很难理解的。 <br>??? 比如代理模式,最主要的远程代理,如果没实际经验的不知所云。完全迷茫的。 <br>??? 感觉还是在实际中遇到问题,仔细思考后,再映射到设计模式上,这样理解起来更透彻。 <br>??? </div>
<br><br>是啊,我也是这么想的,但感觉还得先学学,要不然用到了都不知道!先学学理论,争取能多理解点,实际中用到了在深入理解吧!</div>
<p>?</p>
<p>其实最重要的是掌握面向对象设计的基本原理,然后去理解这些模式就会很自然。</p>
<p>?</p>
<p>比较重要的类设计原则有:?</p>
<p>SRP, 单一职责原则, 一个类应该只有一个引起它变化的原因</p>
<p>OCP, 开放封闭原则, 类,函数,或模块应该是可以扩展的,但是不可以修改的</p>
<p>DIP,依赖倒置原则 , 应该依赖于抽像, 而不应该依赖于细节, 特别是,抽像不应该依赖于细节</p>
<p>LSP Liskou替换原则?,子类应该能够替换父类, 而不是仅仅为了重用去继承</p>
<p>ISP, 接口隔层原则, 接口不属于实现者,它更属于客户。 </p>
<p>?</p>
<p>?</p>
<p>可以从模式中去掌握这些基本设计原则, 所以蕴涵在设计模式中的原理比模式本身的表现出的类结构层次结构,关系最重要的。</p>
<p>?</p>
<p>?</p> 8 楼 hell_liul 2010-01-15 <div class="quote_title">bencode 写道</div>
<div class="quote_div">
<p>其实最重要的是掌握面向对象设计的基本原理,然后去理解这些模式就会很自然。</p>
<p>?</p>
<p>比较重要的类设计原则有:?</p>
<p>SRP, 单一职责原则, 一个类应该只有一个引起它变化的原因</p>
<p>OCP, 开放封闭原则, 类,函数,或模块应该是可以扩展的,但是不可以修改的</p>
<p>DIP,依赖倒置原则 , 应该依赖于抽像, 而不应该依赖于细节, 特别是,抽像不应该依赖于细节</p>
<p>LSP Liskou替换原则?,子类应该能够替换父类, 而不是仅仅为了重用去继承</p>
<p>ISP, 接口隔层原则, 接口不属于实现者,它更属于客户。 </p>
<p>?</p>
<p>?</p>
<p>可以从模式中去掌握这些基本设计原则, 所以蕴涵在设计模式中的原理比模式本身的表现出的类结构层次结构,关系最重要的。</p>
<p>?</p>
<p>?</p>
</div>
<p><br>哦,看来还有好多东西要看啊!以前外包了,刚刚转过来,路还很长啊!</p> 9 楼 prowl 2010-01-15 感觉2楼给的代理模式有误导的倾向 10 楼 hell_liul 2010-01-15 prowl 写道感觉2楼给的代理模式有误导的倾向
说说自己看法!向他发炮,让他也成为“炮灰”!哈哈 11 楼 prowl 2010-01-15 代理模式务必要清楚的就是,代理者和被代理者,调用和被调用者的关系。
被调用者 被 代理
调用者 操作 代理者
代理对象和真实对象存在聚合关系
12 楼 Durian 2010-01-18 to @bencode
总结的很清楚,尤其是那几个原则。
(从单例模式上讲解顺序看,bencode 应该看过设计模式解析这本书)
我对策略模式为何只能封装算法不太理解,感觉跟工厂模式,即,让子类延迟实现方法应该属于同一类型的模式。不知道为何分成2个。 13 楼 gdufsbobo 2010-01-19 我觉得有时候一些模式很无聊,也见过一些程序员为了模式而使用模式。“实最重要的是掌握面向对象设计的基本原理,然后去理解这些模式就会很自然。”,这句话很有道理。 14 楼 ilove2009 2010-02-04 gdufsbobo 写道我觉得有时候一些模式很无聊,也见过一些程序员为了模式而使用模式。“实最重要的是掌握面向对象设计的基本原理,然后去理解这些模式就会很自然。”,这句话很有道理。
说的有道理,你说的“一些程序员为了模式而使用模式”也许是别人的一个学习过程。 15 楼 andsofish 2010-02-04 个人觉得 设计模式就是武当的太极剑
还记得倚天里面的桥段么
张三丰:记住了么?
张无忌:记住了。
//练习
张三丰:忘记了么?
张无忌:全忘了
张三丰:你出师了。