- 浏览: 41784 次
- 性别:
- 来自: 北京
最新评论
-
青春的、脚步:
...
java组合模式简单理解 -
weishuguangeye:
不错,总结的非常好!
java组合模式简单理解 -
andsofish:
个人觉得 设计模式就是武当的太极剑
还记得倚天里面的桥段么
...
炮灰:几个设计模式理解1 -
ilove2009:
<div class="quote_title ...
炮灰:几个设计模式理解1 -
gdufsbobo:
我觉得有时候一些模式很无聊,也见过一些程序员为了模式而使用模式 ...
炮灰:几个设计模式理解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]。
说的有道理,你说的“一些程序员为了模式而使用模式”也许是别人的一个学习过程。
说说自己看法!向他发炮,让他也成为“炮灰”!哈哈
是啊,我也是这么想的,但感觉还得先学学,要不然用到了都不知道!先学学理论,争取能多理解点,实际中用到了在深入理解吧!
我没说工厂模式啊,最近也是刚刚研究,学习阶段,很多理解不到位,所以要先当“炮灰”啊!哈哈
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]。
评论
15 楼
andsofish
2010-02-04
个人觉得 设计模式就是武当的太极剑
还记得倚天里面的桥段么
张三丰:记住了么?
张无忌:记住了。
//练习
张三丰:忘记了么?
张无忌:全忘了
张三丰:你出师了。
还记得倚天里面的桥段么
张三丰:记住了么?
张无忌:记住了。
//练习
张三丰:忘记了么?
张无忌:全忘了
张三丰:你出师了。
14 楼
ilove2009
2010-02-04
gdufsbobo 写道
我觉得有时候一些模式很无聊,也见过一些程序员为了模式而使用模式。“实最重要的是掌握面向对象设计的基本原理,然后去理解这些模式就会很自然。”,这句话很有道理。
说的有道理,你说的“一些程序员为了模式而使用模式”也许是别人的一个学习过程。
13 楼
gdufsbobo
2010-01-19
我觉得有时候一些模式很无聊,也见过一些程序员为了模式而使用模式。“实最重要的是掌握面向对象设计的基本原理,然后去理解这些模式就会很自然。”,这句话很有道理。
12 楼
Durian
2010-01-18
to @bencode
总结的很清楚,尤其是那几个原则。
(从单例模式上讲解顺序看,bencode 应该看过设计模式解析这本书)
我对策略模式为何只能封装算法不太理解,感觉跟工厂模式,即,让子类延迟实现方法应该属于同一类型的模式。不知道为何分成2个。
总结的很清楚,尤其是那几个原则。
(从单例模式上讲解顺序看,bencode 应该看过设计模式解析这本书)
我对策略模式为何只能封装算法不太理解,感觉跟工厂模式,即,让子类延迟实现方法应该属于同一类型的模式。不知道为何分成2个。
11 楼
prowl
2010-01-15
代理模式务必要清楚的就是,代理者和被代理者,调用和被调用者的关系。
被调用者 被 代理
调用者 操作 代理者
代理对象和真实对象存在聚合关系
被调用者 被 代理
调用者 操作 代理者
代理对象和真实对象存在聚合关系
10 楼
hell_liul
2010-01-15
prowl 写道
感觉2楼给的代理模式有误导的倾向
说说自己看法!向他发炮,让他也成为“炮灰”!哈哈
9 楼
prowl
2010-01-15
感觉2楼给的代理模式有误导的倾向
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>
<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>
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>
<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>
6 楼
hell_liul
2010-01-15
<div class="quote_title">bencode 写道</div>
<div class="quote_div">
<p>啊? 好像全部都不对呀:) 首先模式是一种思想(如果理解了,请仅仅把它当成词汇,方便交流) <br><br><strong>1. 代理模式</strong></p>
<div class="quote_title">引用</div>
<div class="quote_div">
<br>要求委托第三方来做,要求代理类和被代理类有同样的功能,代理类必须知道代理类有什么功能 <br>
</div>
<p><br>不正确。</p>
<p><br><br><strong>而是为对象提供一种代理,以控制一个对象的仿问, 至于做什么没关系,可能做完全不同的事。</strong> <br><br>对于客户来说(使用这个对象的客户)是透明的, 他不关心也不需要知道操作的是原对象还是代理对象。 <br><br> 比方说你有一个访问数据库的耗时操作 DAO, 他是直接操作数据库的, 你需要实现缓存, 你可以实现一个 CachedDAO.</p>
interface IDAO { Object getData(String key); } class DAO implements IDAO { public Object getData(String key) { Object o = ...// read from database that consume time. return o; } } class CachedDAO implements IDAO { public Object getData(String key) { Object o = // 在缓存中先看看 if (o == null) { o = dao.getData(key); // 这时候仿问真实的DAO对象 } return o; } } class Client { public void useDAO(IDAO dao) { Object o = dao.getData("abc"); // 可能来自代理哦, Client并不知道 } }
<pre></pre>
<p><br><br><strong>2. 策略模式</strong> <br><br>主要用于<strong>封装算法</strong>, 使得算法可以独立于客户而变化。 <br><br><strong>3. 单例模式</strong></p>
<p> </p>
<div class="quote_title">写道</div>
<div class="quote_div">方法大部分是private的(只有内部访问),getInstance是static,为了避免多线程,使用synchronized。</div>
<p> </p>
<p>前半部分:错误!</p>
<p> </p>
<p> 单例模式(Singleton) : 保证一个类仅有一个实例, 并提供一个访问它的全局访问点。</p>
<p> </p>
<p>后半部分没说清楚: </p>
<p> </p>
<p>楼主想说的应该是: 延迟初始化, 在多线程环境下,需要考虑线程安全。 </p>
<p> </p>
<p> 可以采用 synchronized 在方法上同步, 也可以 double check 在方法内进行同步。也可以像下面这样(很简洁, 也不需要同步,由JAVA类载入器来保证线程安全)</p>
<p> </p>
public class Sington { private static class SingtonHolder { public static Sington INSTANCE = new Sington(); } public static Sington getInstance() { return SingtonHolder.INSTANCE; } private Sington() { } }
<pre></pre>
<p> </p>
<p>多例模式:</p>
<p> </p>
<p>没听说过。 <span lang="EN-US">Flyweight? 还是 <span style="font-size: 9pt;" lang="EN-US">Prototype?</span></span></p>
<p> </p>
<p> </p>
<p><br><strong>适配器</strong></p>
<p><strong></strong> </p>
<p> </p>
<div class="quote_title">写道</div>
<div class="quote_div">个人认为目的是对一个事物的不同的两个类(A、B)的描述(因为可能是不同系统),为了使用两个类统一,首先使用统一接口,定义个类(适配器,将类重新改造、整合重组)继承B,将原有的信息重组为接口的统一信息。 </div>
<p> </p>
<p>可能你理解了,但表达不清。</p>
<p> </p>
<p>适配器就是适配作用, 比如系统要用一个类,比如需要排序。</p>
<p> </p>
interface Sorter { void sort(int[] a); } class Client { public void use(Sorter sorter) { // .. } }
<pre></pre>
<p> </p>
<p> </p>
<p>但是你刚好有一个类, 他完成了复杂的排序(尽管对数组的排序并不复杂), 但是他是这样的</p>
<p> </p>
class MySorter() { public void quickSort(int[] a) { // } }
<pre></pre>
<p> </p>
<p>方法签名不对,即使对也用不上(因为没有实现Sorter接口)</p>
<p> </p>
<p>所以你要配接它:</p>
<p> </p>
class MySorterAdapter implements Sorter { private MySorter sorter; public MySorterAdapter(MySorter sorter) { this.sorter = sorter; } public void sort(int[] a) { sorter.quickSort(a); } }
<pre></pre>
<p> </p>
<p>这时候就可以通过 MySorterAdapter ,在Client 环境下,使用 MySorter类了。</p>
<p> </p>
<p> </p>
<p><strong>门面模式</strong></p>
<p> </p>
<div class="quote_title">写道</div>
<div class="quote_div">对client端不透明,高内聚松耦合,定义接口,具体动作实现类,门户类,对于门户类可以设置实现类的动作执行顺序等,对client端提供执行的接口。 </div>
<p> </p>
<p> </p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">Facade: ....</span></span></span></p>
<p><span lang="EN-US"></span></p>
<p><span lang="EN-US"><span lang="EN-US">假设你有一个复杂的系统,很复杂呀, 文档像牛津大字典一样厚。</span></span></p>
<p> </p>
<p><span lang="EN-US"><span lang="EN-US">然后你的老板叫你开发一个新的系统,配合这个系统用, 新的系统仅仅用到了这个系统的一部分,比如用户资料。</span></span></p>
<p> </p>
<p><span lang="EN-US"><span lang="EN-US">新系统由五个人开发。</span></span></p>
<p> </p>
<p><span lang="EN-US"><span lang="EN-US">然后你只要分配出一个人, 研究一下那个牛津字典的一小部分, 先写一个<span lang="EN-US">Facade, 用于“读” “写” 用户资料。 其他的部分不用管他。</span></span></span></p>
<p><span lang="EN-US"></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"><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=""></p>
<div class="quote_div">
<p>啊? 好像全部都不对呀:) 首先模式是一种思想(如果理解了,请仅仅把它当成词汇,方便交流) <br><br><strong>1. 代理模式</strong></p>
<div class="quote_title">引用</div>
<div class="quote_div">
<br>要求委托第三方来做,要求代理类和被代理类有同样的功能,代理类必须知道代理类有什么功能 <br>
</div>
<p><br>不正确。</p>
<p><br><br><strong>而是为对象提供一种代理,以控制一个对象的仿问, 至于做什么没关系,可能做完全不同的事。</strong> <br><br>对于客户来说(使用这个对象的客户)是透明的, 他不关心也不需要知道操作的是原对象还是代理对象。 <br><br> 比方说你有一个访问数据库的耗时操作 DAO, 他是直接操作数据库的, 你需要实现缓存, 你可以实现一个 CachedDAO.</p>
interface IDAO { Object getData(String key); } class DAO implements IDAO { public Object getData(String key) { Object o = ...// read from database that consume time. return o; } } class CachedDAO implements IDAO { public Object getData(String key) { Object o = // 在缓存中先看看 if (o == null) { o = dao.getData(key); // 这时候仿问真实的DAO对象 } return o; } } class Client { public void useDAO(IDAO dao) { Object o = dao.getData("abc"); // 可能来自代理哦, Client并不知道 } }
<pre></pre>
<p><br><br><strong>2. 策略模式</strong> <br><br>主要用于<strong>封装算法</strong>, 使得算法可以独立于客户而变化。 <br><br><strong>3. 单例模式</strong></p>
<p> </p>
<div class="quote_title">写道</div>
<div class="quote_div">方法大部分是private的(只有内部访问),getInstance是static,为了避免多线程,使用synchronized。</div>
<p> </p>
<p>前半部分:错误!</p>
<p> </p>
<p> 单例模式(Singleton) : 保证一个类仅有一个实例, 并提供一个访问它的全局访问点。</p>
<p> </p>
<p>后半部分没说清楚: </p>
<p> </p>
<p>楼主想说的应该是: 延迟初始化, 在多线程环境下,需要考虑线程安全。 </p>
<p> </p>
<p> 可以采用 synchronized 在方法上同步, 也可以 double check 在方法内进行同步。也可以像下面这样(很简洁, 也不需要同步,由JAVA类载入器来保证线程安全)</p>
<p> </p>
public class Sington { private static class SingtonHolder { public static Sington INSTANCE = new Sington(); } public static Sington getInstance() { return SingtonHolder.INSTANCE; } private Sington() { } }
<pre></pre>
<p> </p>
<p>多例模式:</p>
<p> </p>
<p>没听说过。 <span lang="EN-US">Flyweight? 还是 <span style="font-size: 9pt;" lang="EN-US">Prototype?</span></span></p>
<p> </p>
<p> </p>
<p><br><strong>适配器</strong></p>
<p><strong></strong> </p>
<p> </p>
<div class="quote_title">写道</div>
<div class="quote_div">个人认为目的是对一个事物的不同的两个类(A、B)的描述(因为可能是不同系统),为了使用两个类统一,首先使用统一接口,定义个类(适配器,将类重新改造、整合重组)继承B,将原有的信息重组为接口的统一信息。 </div>
<p> </p>
<p>可能你理解了,但表达不清。</p>
<p> </p>
<p>适配器就是适配作用, 比如系统要用一个类,比如需要排序。</p>
<p> </p>
interface Sorter { void sort(int[] a); } class Client { public void use(Sorter sorter) { // .. } }
<pre></pre>
<p> </p>
<p> </p>
<p>但是你刚好有一个类, 他完成了复杂的排序(尽管对数组的排序并不复杂), 但是他是这样的</p>
<p> </p>
class MySorter() { public void quickSort(int[] a) { // } }
<pre></pre>
<p> </p>
<p>方法签名不对,即使对也用不上(因为没有实现Sorter接口)</p>
<p> </p>
<p>所以你要配接它:</p>
<p> </p>
class MySorterAdapter implements Sorter { private MySorter sorter; public MySorterAdapter(MySorter sorter) { this.sorter = sorter; } public void sort(int[] a) { sorter.quickSort(a); } }
<pre></pre>
<p> </p>
<p>这时候就可以通过 MySorterAdapter ,在Client 环境下,使用 MySorter类了。</p>
<p> </p>
<p> </p>
<p><strong>门面模式</strong></p>
<p> </p>
<div class="quote_title">写道</div>
<div class="quote_div">对client端不透明,高内聚松耦合,定义接口,具体动作实现类,门户类,对于门户类可以设置实现类的动作执行顺序等,对client端提供执行的接口。 </div>
<p> </p>
<p> </p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">Facade: ....</span></span></span></p>
<p><span lang="EN-US"></span></p>
<p><span lang="EN-US"><span lang="EN-US">假设你有一个复杂的系统,很复杂呀, 文档像牛津大字典一样厚。</span></span></p>
<p> </p>
<p><span lang="EN-US"><span lang="EN-US">然后你的老板叫你开发一个新的系统,配合这个系统用, 新的系统仅仅用到了这个系统的一部分,比如用户资料。</span></span></p>
<p> </p>
<p><span lang="EN-US"><span lang="EN-US">新系统由五个人开发。</span></span></p>
<p> </p>
<p><span lang="EN-US"><span lang="EN-US">然后你只要分配出一个人, 研究一下那个牛津字典的一小部分, 先写一个<span lang="EN-US">Facade, 用于“读” “写” 用户资料。 其他的部分不用管他。</span></span></span></p>
<p><span lang="EN-US"></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"><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=""></p>
5 楼
hell_liul
2010-01-15
lujiawu12 写道
实践出真理啊。
我也对23种设计模式做过学习,但是很多讲的虽然明白,但是在实际运用中还是模棱两可的,好多模式都有相似点。没有点实际开发经验感觉很难理解的。
比如代理模式,最主要的远程代理,如果没实际经验的不知所云。完全迷茫的。
感觉还是在实际中遇到问题,仔细思考后,再映射到设计模式上,这样理解起来更透彻。
我也对23种设计模式做过学习,但是很多讲的虽然明白,但是在实际运用中还是模棱两可的,好多模式都有相似点。没有点实际开发经验感觉很难理解的。
比如代理模式,最主要的远程代理,如果没实际经验的不知所云。完全迷茫的。
感觉还是在实际中遇到问题,仔细思考后,再映射到设计模式上,这样理解起来更透彻。
是啊,我也是这么想的,但感觉还得先学学,要不然用到了都不知道!先学学理论,争取能多理解点,实际中用到了在深入理解吧!
4 楼
hell_liul
2010-01-15
habzyhs 写道
这两天 刚刚开始接触设计模式,刚刚看了一个视频里面的工厂模式。看上去跟lz说的一个都对不上呢?不会是我还没有理解到位吧。
我没说工厂模式啊,最近也是刚刚研究,学习阶段,很多理解不到位,所以要先当“炮灰”啊!哈哈
3 楼
lujiawu12
2010-01-15
实践出真理啊。
我也对23种设计模式做过学习,但是很多讲的虽然明白,但是在实际运用中还是模棱两可的,好多模式都有相似点。没有点实际开发经验感觉很难理解的。
比如代理模式,最主要的远程代理,如果没实际经验的不知所云。完全迷茫的。
感觉还是在实际中遇到问题,仔细思考后,再映射到设计模式上,这样理解起来更透彻。
我也对23种设计模式做过学习,但是很多讲的虽然明白,但是在实际运用中还是模棱两可的,好多模式都有相似点。没有点实际开发经验感觉很难理解的。
比如代理模式,最主要的远程代理,如果没实际经验的不知所云。完全迷茫的。
感觉还是在实际中遇到问题,仔细思考后,再映射到设计模式上,这样理解起来更透彻。
2 楼
habzyhs
2010-01-15
这两天 刚刚开始接触设计模式,刚刚看了一个视频里面的工厂模式。看上去跟lz说的一个都对不上呢?不会是我还没有理解到位吧。
1 楼
bencode
2010-01-14
<p>啊? 好像全部都不对呀:) 首先模式是一种思想(如果理解了,请仅仅把它当成词汇,方便交流) <br><br><strong>1. 代理模式</strong> <br></p>
<div class="quote_title">引用</div>
<div class="quote_div">
<br>要求委托第三方来做,要求代理类和被代理类有同样的功能,代理类必须知道代理类有什么功能 <br>
</div>
<p><br>不正确。</p>
<p><br><br><strong>而是为对象提供一种代理,以控制一个对象的仿问, 至于做什么没关系,可能做完全不同的事。</strong> <br><br>对于客户来说(使用这个对象的客户)是透明的, 他不关心也不需要知道操作的是原对象还是代理对象。 <br><br> 比方说你有一个访问数据库的耗时操作 DAO, 他是直接操作数据库的, 你需要实现缓存, 你可以实现一个 CachedDAO. <br></p>
<pre name="code" class="java">interface IDAO {
Object getData(String key);
}
class DAO implements IDAO {
public Object getData(String key) {
Object o = ...// read from database that consume time.
return o;
}
}
class CachedDAO implements IDAO {
public Object getData(String key) {
Object o = // 在缓存中先看看
if (o == null) {
o = dao.getData(key); // 这时候仿问真实的DAO对象
}
return o;
}
}
class Client {
public void useDAO(IDAO dao) {
Object o = dao.getData("abc"); // 可能来自代理哦, Client并不知道
}
}
</pre>
<p><br><br><strong>2. 策略模式</strong> <br><br>主要用于<strong>封装算法</strong>, 使得算法可以独立于客户而变化。 <br><br><strong>3. 单例模式</strong></p>
<p> </p>
<div class="quote_title">写道</div>
<div class="quote_div">方法大部分是private的(只有内部访问),getInstance是static,为了避免多线程,使用synchronized。</div>
<p> </p>
<p>前半部分:错误!</p>
<p> </p>
<p> 单例模式(Singleton) : 保证一个类仅有一个实例, 并提供一个访问它的全局访问点。</p>
<p> </p>
<p>后半部分没说清楚: </p>
<p> </p>
<p>楼主想说的应该是: 延迟初始化, 在多线程环境下,需要考虑线程安全。 </p>
<p> </p>
<p> 可以采用 synchronized 在方法上同步, 也可以 double check 在方法内进行同步。也可以像下面这样(很简洁, 也不需要同步,由JAVA类载入器来保证线程安全)</p>
<p> </p>
<pre name="code" class="java">public class Sington {
private static class SingtonHolder {
public static Sington INSTANCE = new Sington();
}
public static Sington getInstance() {
return SingtonHolder.INSTANCE;
}
private Sington() { }
} </pre>
<p> </p>
<p>多例模式:</p>
<p> </p>
<p>没听说过。 <span lang="EN-US">Flyweight? 还是 <span style="font-size: 9pt;" lang="EN-US">Prototype?</span></span></p>
<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 class="quote_title">写道</div>
<div class="quote_div">个人认为目的是对一个事物的不同的两个类(A、B)的描述(因为可能是不同系统),为了使用两个类统一,首先使用统一接口,定义个类(适配器,将类重新改造、整合重组)继承B,将原有的信息重组为接口的统一信息。 </div>
<p> </p>
<p>可能你理解了,但表达不清。</p>
<p> </p>
<p>适配器就是适配作用, 比如系统要用一个类,比如需要排序。</p>
<p> </p>
<pre name="code" class="java">interface Sorter {
void sort(int[] a);
}
class Client {
public void use(Sorter sorter) {
// ..
}
}</pre>
<p> </p>
<p> </p>
<p>但是你刚好有一个类, 他完成了复杂的排序(尽管对数组的排序并不复杂), 但是他是这样的</p>
<p> </p>
<pre name="code" class="java">class MySorter() {
public void quickSort(int[] a) {
//
}
}</pre>
<p> </p>
<p>方法签名不对,即使对也用不上(因为没有实现Sorter接口)</p>
<p> </p>
<p>所以你要配接它:</p>
<p> </p>
<pre name="code" class="java">class MySorterAdapter implements Sorter {
private MySorter sorter;
public MySorterAdapter(MySorter sorter) {
this.sorter = sorter;
}
public void sort(int[] a) {
sorter.quickSort(a);
}
}</pre>
<p> </p>
<p>这时候就可以通过 MySorterAdapter ,在Client 环境下,使用 MySorter类了。</p>
<p> </p>
<p> </p>
<p><strong>门面模式</strong></p>
<p> </p>
<div class="quote_title">写道</div>
<div class="quote_div">对client端不透明,高内聚松耦合,定义接口,具体动作实现类,门户类,对于门户类可以设置实现类的动作执行顺序等,对client端提供执行的接口。 </div>
<p> </p>
<p> </p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">Facade: ....</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></p>
<p><span lang="EN-US"><span lang="EN-US">然后你的老板叫你开发一个新的系统,配合这个系统用, 新的系统仅仅用到了这个系统的一部分,比如用户资料。</span></span></p>
<p><span lang="EN-US"></span></p>
<p><span lang="EN-US"><span lang="EN-US">新系统由五个人开发。</span></span></p>
<p><span lang="EN-US"></span></p>
<p><span lang="EN-US"><span lang="EN-US">然后你只要分配出一个人, 研究一下那个牛津字典的一小部分, 先写一个<span lang="EN-US">Facade, 用于“读” “写” 用户资料。 其他的部分不用管他。</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></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">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" class="java">个人认为,利用原来的原型,创建和原来关系密切,没有太大变化的新类,经常利用Object的cloneable(),复制原型,注意这是浅复制,理解浅复制和深复制[size=medium][/size]。 </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 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>
<div class="quote_title">引用</div>
<div class="quote_div">
<br>要求委托第三方来做,要求代理类和被代理类有同样的功能,代理类必须知道代理类有什么功能 <br>
</div>
<p><br>不正确。</p>
<p><br><br><strong>而是为对象提供一种代理,以控制一个对象的仿问, 至于做什么没关系,可能做完全不同的事。</strong> <br><br>对于客户来说(使用这个对象的客户)是透明的, 他不关心也不需要知道操作的是原对象还是代理对象。 <br><br> 比方说你有一个访问数据库的耗时操作 DAO, 他是直接操作数据库的, 你需要实现缓存, 你可以实现一个 CachedDAO. <br></p>
<pre name="code" class="java">interface IDAO {
Object getData(String key);
}
class DAO implements IDAO {
public Object getData(String key) {
Object o = ...// read from database that consume time.
return o;
}
}
class CachedDAO implements IDAO {
public Object getData(String key) {
Object o = // 在缓存中先看看
if (o == null) {
o = dao.getData(key); // 这时候仿问真实的DAO对象
}
return o;
}
}
class Client {
public void useDAO(IDAO dao) {
Object o = dao.getData("abc"); // 可能来自代理哦, Client并不知道
}
}
</pre>
<p><br><br><strong>2. 策略模式</strong> <br><br>主要用于<strong>封装算法</strong>, 使得算法可以独立于客户而变化。 <br><br><strong>3. 单例模式</strong></p>
<p> </p>
<div class="quote_title">写道</div>
<div class="quote_div">方法大部分是private的(只有内部访问),getInstance是static,为了避免多线程,使用synchronized。</div>
<p> </p>
<p>前半部分:错误!</p>
<p> </p>
<p> 单例模式(Singleton) : 保证一个类仅有一个实例, 并提供一个访问它的全局访问点。</p>
<p> </p>
<p>后半部分没说清楚: </p>
<p> </p>
<p>楼主想说的应该是: 延迟初始化, 在多线程环境下,需要考虑线程安全。 </p>
<p> </p>
<p> 可以采用 synchronized 在方法上同步, 也可以 double check 在方法内进行同步。也可以像下面这样(很简洁, 也不需要同步,由JAVA类载入器来保证线程安全)</p>
<p> </p>
<pre name="code" class="java">public class Sington {
private static class SingtonHolder {
public static Sington INSTANCE = new Sington();
}
public static Sington getInstance() {
return SingtonHolder.INSTANCE;
}
private Sington() { }
} </pre>
<p> </p>
<p>多例模式:</p>
<p> </p>
<p>没听说过。 <span lang="EN-US">Flyweight? 还是 <span style="font-size: 9pt;" lang="EN-US">Prototype?</span></span></p>
<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 class="quote_title">写道</div>
<div class="quote_div">个人认为目的是对一个事物的不同的两个类(A、B)的描述(因为可能是不同系统),为了使用两个类统一,首先使用统一接口,定义个类(适配器,将类重新改造、整合重组)继承B,将原有的信息重组为接口的统一信息。 </div>
<p> </p>
<p>可能你理解了,但表达不清。</p>
<p> </p>
<p>适配器就是适配作用, 比如系统要用一个类,比如需要排序。</p>
<p> </p>
<pre name="code" class="java">interface Sorter {
void sort(int[] a);
}
class Client {
public void use(Sorter sorter) {
// ..
}
}</pre>
<p> </p>
<p> </p>
<p>但是你刚好有一个类, 他完成了复杂的排序(尽管对数组的排序并不复杂), 但是他是这样的</p>
<p> </p>
<pre name="code" class="java">class MySorter() {
public void quickSort(int[] a) {
//
}
}</pre>
<p> </p>
<p>方法签名不对,即使对也用不上(因为没有实现Sorter接口)</p>
<p> </p>
<p>所以你要配接它:</p>
<p> </p>
<pre name="code" class="java">class MySorterAdapter implements Sorter {
private MySorter sorter;
public MySorterAdapter(MySorter sorter) {
this.sorter = sorter;
}
public void sort(int[] a) {
sorter.quickSort(a);
}
}</pre>
<p> </p>
<p>这时候就可以通过 MySorterAdapter ,在Client 环境下,使用 MySorter类了。</p>
<p> </p>
<p> </p>
<p><strong>门面模式</strong></p>
<p> </p>
<div class="quote_title">写道</div>
<div class="quote_div">对client端不透明,高内聚松耦合,定义接口,具体动作实现类,门户类,对于门户类可以设置实现类的动作执行顺序等,对client端提供执行的接口。 </div>
<p> </p>
<p> </p>
<p><span lang="EN-US"><span lang="EN-US"><span lang="EN-US">Facade: ....</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></p>
<p><span lang="EN-US"><span lang="EN-US">然后你的老板叫你开发一个新的系统,配合这个系统用, 新的系统仅仅用到了这个系统的一部分,比如用户资料。</span></span></p>
<p><span lang="EN-US"></span></p>
<p><span lang="EN-US"><span lang="EN-US">新系统由五个人开发。</span></span></p>
<p><span lang="EN-US"></span></p>
<p><span lang="EN-US"><span lang="EN-US">然后你只要分配出一个人, 研究一下那个牛津字典的一小部分, 先写一个<span lang="EN-US">Facade, 用于“读” “写” 用户资料。 其他的部分不用管他。</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></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">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" class="java">个人认为,利用原来的原型,创建和原来关系密切,没有太大变化的新类,经常利用Object的cloneable(),复制原型,注意这是浅复制,理解浅复制和深复制[size=medium][/size]。 </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 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>
相关推荐
炮灰域名设置教程
而采用炮灰策略,假设M=1,即使第一个追求者非常优秀也予以拒绝,后续若出现比第一个追求者更优秀的人则接受,此时选择到Mr. Right的概率提升到了1/2。 #### 数学推导 为了求解一般情况下,对于任意的N值,应该...
00[序言] - 炮灰的专栏 - CSDNBlog.mht 01[初识Direct3D] - 炮灰的专栏 - CSDNBlog.mht <br> 02[并非3D的3D] - 炮灰的专栏 - CSDNBlog.mht 03[谁把我挡住了] - 炮灰的专栏 - CSDNBlog.mht <br> 04[动...
H5新版盲盒交友新增心动引荐炮灰域名易支付虎皮椒等功用 亲测可用图片[1]-H5新版盲盒交友新增心动引荐炮灰域名易支付虎皮椒等功用 亲测可用-源码库项目引见 1、网站后台共分为九大模块,分别为:留一个、取一个、...
1. **游戏吸引力**:游戏的封面和名称是吸引玩家的重要因素,一个有吸引力的标题和视觉设计能够促使玩家尝试游戏。 2. **游戏玩法和故事深度**:即使没有明显的"大开金手指"(即主角拥有超乎寻常的能力),游戏的...
1、支持设置无限多个炮灰域名; 2、支持给指定文章设置指定的炮灰域名,比如这篇文章用这6个炮灰域名,另一篇文章用那8个炮灰域名; 3、支持设置分享后跳转链接; 4、支持设置分享后弹出图片广告,点击后跳转指定...
1.文章获客:用户可以采集优质公众号文章,插入自己的广告,让广告与无形,随着文章飞出自己的朋友圈,打破直接发广告被屏蔽的弊端。 2.个人微店:添加好商品,把名片或视频分享出去,别人打开以后可以直接在线付款...
从给定文件的内容中,我们可以提炼出以下几个知识点: 一、流行新词语的分类及特点 在现代汉语中,流行新词语按照其表达的内容和方式可以分为不同的类别,尤其值得注意的是表人流行新词语。这类词语具有以下特点: ...
H5盲盒交友源码抖音最火项目,特色功能;自定义虚拟数量、推广海报、IP黑名单、自定义价格、强制先留在抽、区分普通盲盒和条件盲盒、新闻和广告模块,等众多功能
1. 九块九加群微信裂变人脉吃瓜宝妈同城相亲交友取图表情包 2. 支持创建各种付费群,表情,吃瓜,创业,资源等等 3. 支付对接第三方易支付,随便一家易支付平台都可以对接,进群码直接在后台上传就行,简单好操作 ...
(必中几项,只中1项,只中几项,必中a+随机b,必中随机组合) 炮灰域名-设置主域名、炮灰域名 分销返佣到零钱-一级返佣,二级返佣自定义 支持支付和企业付款到零钱分离 推广/分享好友参与送拆盒次数 多种奖品...
活动的助力群,资源分享群,还有一些交友群等等,当然并不局限于这几个场景,只要是有需要用到收费才能进群这个需求的都是可以使用付费进群功能的。 源码为thinkphp独立开发,搭建简单,效率上线。 自带防洪跳转,...
测试环境:系统环境:CentOS Linux 7.6.1810 (Core)、运行环境:宝塔 Linux v7.0.3(专业版)、网站环境:Nginx 1.15.10 + MySQL 5.6.46 +...版本号:1.4.9 – 无限多开版、【新增】代理商插件跟随主应用新炮灰域名做升级
仅供学习交流使用,不提供技术支持
活动的助力群,资源分享群,还有一些交友群等等,当然并不局限于这几个场景,只要是有需要用到收费才能进群这个需求的都是可以使用付费进群功能的。 源码为thinkphp独立开发,搭建简单,效率上线。 自带防洪跳转,...
H5盲盒商城系统源码带uniapp前端...新增炮灰域名这个源码用了学习研究都是不错的东西。视频教程:https://www.bilibili.com/video/BV1V84y1k7n5/?share_source=copy_web&vd_source=f74e1241c8e8a96a16da3807dc7357d9
学习这个项目,开发者可以深入理解MFC如何处理复杂的窗口布局和交互,进一步提升Windows应用开发能力。通过实践,你可以更好地掌握MFC中的窗口分割技术,为自己的项目带来更灵活、多视图的用户界面。
⑥ 支持落地页炮灰域名,后台更换便捷 nginx1.2 php5.6--7.2均可最好是7.2 第一步:上传文件程序到网站根目录解压 第二步:导入数据库(数据库.sql) 第三步:修改/config/database.php里面的数据库地址 第四步:修改/...
更新公众号版本1.06版本,为目前市面最新版本,支持炮灰域名,有效防止红名问题,修复多处bug,提高稳定性 2021-10-12: 新增小程序版本,已经过测试,可运行,有简易教程,方便快速部署 2021-10-10: 更新新版本...
前段时间花钱买的小程序源码 感觉太单调了 全开源版本小程序这个小程序是云开发的不需要服务器域名支持流量主wx支付。超级能吸引年轻人的一款小程序版本新增:1.Ui美化2.星座匹配(通过星座进行盲盒)3.后台管理...