CSDN博客

img yuanqingfei

设计模式的比喻

发表于2004/7/10 17:31:00  994人阅读

分类: 〖Java〗

着楼主的帖子,在心里把GOF DP又过了一遍,感觉这种方式来学习DP很可取,不拘泥于具体而着重于思想。里面的一些内容个人觉得有些地方不太恰当,提出来供参考:
创建型模式
1、FACTORY—人才市场:以往是要哪个人才,就找哪个人才,效率低,现在有了人才市场,我们只需直接去人才市场挑一个好了;
--人市换成猎头公司如何?

2、BUILDER—生产流水线:以前是手工业作坊式的人工单个单个的生产零件然后一步一步组装做,好比有了工业革命,现在都由生产流水线代替了。如要造丰田汽车,先制定汽车的构造如由车胎、方向盘、发动机组成。再以此构造标准生产丰田汽车的车胎、方向盘、发动机。然后进行组装。最后得到丰田汽车;
--将丰田车换成丰田车不同系列如何,相同构件不同的组装过程。

3、SINGLETON—唯一:以前是商标满天飞,相同的商标难免造成侵权,直从有商标保护法后,就保证了不会再产生第家企业使用相同的商标;
--商标能否换成企业标识?

4、ADAPTER—集众人之私,成一己之公:武当派张三丰会太极拳,少林派智空大师会金刚般若掌,如果他们两个都成为我的师傅,我就既会太极拳,又会金刚般若掌了;
--不可不可,如此与你单挑等于同时单挑少林武当两大宗师?

5、DECORATOR—青出于蓝而胜于蓝:武当派张三丰会太极拳,是我师傅,他教会了我太极拳,但我自己还会点蒙古式摔交,张三丰却不会。于是我就成了DECORATOR模式的实现;
--摔交你可以可太极拳你比张三丰差得太多了,这不叫装饰叫抹黑。:)

6、BRIDGE—白马非马:马之颜色有黑白,马之性别有公母。我们说”这是马”太抽象,说”这是黑色的公马”又太死板,只有将颜色与性别和马动态组合,”这是(黑色的或白色的)(公或母)马”才显得灵活而飘逸,如此bridge模式精髓得矣。
--哪有这么说的?实在想象不出接口与实现分离会是这样的说法。

7、COMPOSITE—大家族:子又生孙,孙又生子,子子孙孙,无穷尽也,将众多纷杂的人口组织成一个按辈分排列的大家族即是此模式的实现;
--是否可以改为家谱?

8、FACADE—求同存异:高中毕业需读初中和高中,博士也需读初中和高中,因此国家将初中和高中普及成九年制义务教育;
--高中也是9年义务教育里面的?修改为收了钱保证上大学的招生办主任如何?他负责打通其他内部环节。

9、FLYWEIGHT—一劳永逸:认识三千汉字,可以应付日常读书与写字,可见头脑中存在这个汉字库的重要;
--恰恰相反,FLYWEIGHT是没有具体属性的,字库需要从外界来。

10、PROXY—垂帘听政:犹如清朝康熙年间的四大府臣,很多权利不在皇帝手里,必须通过辅佐大臣去办;
--换成军机处怎么样?只处理一些常规的事,重要的事还是禀报皇上来弄。

11、CHAIN OF RESPONSIBLEITY—租房:以前为了找房到处打听,效率低且找不到好的房源。现在有了房屋中介,于是向房屋中介提出租房请求,中介提供一个合适的房源,满意则不再请求,不满意继续看房,直到满意为止;
--这样可没有链呀。

12、COMMAND—借刀杀人:以前是想杀谁就杀,但一段时间后领悟到,长此以往必将结仇太多,于是假手他人,挑拨他人之间的关系从而达到自己的目的;
--这句话如果是一把刀说的倒是很贴切。

13、INTERPRETER—文言文注释:一段文言文,将它翻译成白话文;
--换成八股如何?

14、ITERATOR—赶尽杀绝:一个一个的搜索,绝不放掉一个;
--不如换成见什么抄什么,是东西就拿走。

15、MEMENTO—有福同享:我有多少,你就有多少;
--有难同当,有福不同享。

16、STATE—进出自由:如一扇门,能进能出,如果有很多人随时进进出出必定显得杂乱而安全,如今设一保安限制其进出,如此各人进出才显得规范;
--换成红绿灯如何?

17、STRATEGY—久病成良医:如人生病可以有各种症状,但经过长期摸索,就可以总结出感冒、肺病、肝炎等几种;
--实在无法想出相似的地方,以后再说把

19、TEMPLATE METHOD——理论不一定要实践:教练的学生会游泳就行了,至于教练会不会则无关紧要;
--但是教练与学生可不是继承关系。

20、VISITOR—依法治罪:因张三杀人要被处死,李四偷窃要被罚款。由此势必制定处罚制度,故制定法律写明杀人、放火、偷窃等罪要受什么处罚,经通过后须变动要小。今后有人犯罪不管是谁,按共条例处罚即是,这就是访问者模式诞生的全过程;
--完全没这个意思。


chain of responsible:比如你是一个软件公司的开发人员,
你的直接上司是开发组长,组长上面是部门经理,部门经理上面是总经理。
你现在有三个要求:
   第1个是对项目的某些模块有建议,
   第2个是想要涨工资。
   第3个想从公司无息贷款买房子。
你把这三个要求告诉组长,组长只能帮你解决第一个要求,然后他把第2,3个要求转告他的下一个:“节点”部门经理,部门经理可以帮你解决第2个要求,然后把第3个要求转告总经理.....
我想大概是这样。

 


补充strategy模式:
  可以这么打个比方:某黑帮头目有左膀右臂,该头目要杀某人,其左膀主张在晚上路边埋伏然后将其杀掉;右臂主张提前潜入该人家中下毒杀掉。头目考虑两久不知道该怎么做,在最后关头(运行时刻)决定采用左膀的方法....
  不论哪种方法,都达到了相同的目的,可以提取接口:Killer(手下兄弟),该接口有唯一的一个方法体:kill(Man man).左膀右臂分别是实现了Killer接口的类。

 

先继续说说我对Iterator模式的理解:

  假定在战争年代,我党打入敌人内部的地下党员被看做是一个数据结构中的所有成员。
这个时候出了叛徒,在敌人的逼供下,该叛徒招了,该叛徒成为了该数据结构的Iterator.
他可能一个个的全部招供(比如Vector的elements),也可能部分隐瞒,就是我常说的Iterator
的过滤作用,总之这个Iterator有很大的自由度去确定告诉敌人多少个,如何告诉等等。。。。

 


tainy_zhang的Iterator模式很有意思啊,补充一段代码:

// 当年革命战争期间...
Iterator 叛徒 = 地下党.生成叛徒();
while(!叛徒.招供完毕())
{
    特务.逮捕(叛徒.招供());
    叛徒.next();
}

 

 

package china.war.revolution;

public interface Iterator
{
    public 地下党员 招供();
    public boolean 招供完毕();
    public void next();
}

public class 地下党
{
    private vector 地下党员;

    public 地下党() {...}

    public Iterator 生成叛徒() {...};
}

 

 

楼主的那个adapter模式不太对,adapter是把一个不兼容的类(方法名,参数不符合当前客户端要求)变成兼容的类,比如:

儿子只想吃蒸饺,而妈妈只会做水饺,现在爸爸来当适配器:

定义:
class Mother {
  public 水饺 做();
}
class Son {
  public void 吃(蒸饺 jiaozi);
}

儿子.吃()方法的参数与 妈妈.做()返回的不同,所以要一个适配器:

class Adapter {
  private Mother 妈妈;

  public Adapter(Mother 妈妈) {
    this.妈妈 = 妈妈;
  }

  public 蒸饺 做()
  {
    return 烘干(妈妈.做()); // 但是爸爸不会做饺子,只能把妈妈做的变个花样
  };
}

现在儿子可以吃到蒸饺了:
Mother 妈妈 = new Mother();
Son 儿子 = new Son();
Adapter 爸爸 = new Adapter(妈妈);
儿子.吃(爸爸.做());
// 饱了...

0 0

相关博文

我的热门文章

img
取 消
img