-OO-设计模式

举报
资源描述
北京邮电大学计算机学院通信软件工程中心北京邮电大学计算机学院通信软件工程中心http:/www.tseg.org设计模式设计模式1 1 2 4 4 用用GoFGoF设计模式设计用例实现设计模式设计用例实现1.1.适配器模式适配器模式GoFGoF2.2.工厂模式工厂模式GoFGoF3.3.单子模式单子模式GoFGoF4.4.策略模式策略模式GoFGoF5.5.组合模式组合模式GoFGoF6.6.外观模式外观模式GoFGoF7.7.观察者观察者/发布订阅发布订阅/委托事件模式委托事件模式GoFGoF1.1.适配器模式适配器模式在在POSPOS系统中,需要和多个外部系统交互系统中,需要和多个外部系统交互库存系统、税金计算器、账务系统等。库存系统、税金计算器、账务系统等。以使用第三方税金计算器为例以使用第三方税金计算器为例使用使用A A计算器计算器TaxA atax=new TaxA();TaxA atax=new TaxA();TaxA.tax(,);TaxA.tax(,);使用使用B B计算器计算器TaxB atax=new TaxB();TaxB atax=new TaxB();TaxB.getTax(,);TaxB.getTax(,);代码中有两个容易变化的地方:计算器的类名、计算器提供的方法名2 2。使用适配器来屏蔽接口的差异。使用适配器来屏蔽接口的差异 class TaxAdaptor class TaxAdaptor TaxA tax=new TaxA();TaxA tax=new TaxA();float getTaxes()float getTaxes()return tax.tax();return tax.tax();3 3。代码变为。代码变为TaxAdaptorTaxAdaptor adaptor;adaptor;adaptor=new adaptor=new TaxTaxA AAdaptorAdaptor();();adaptor.adaptor.getTaxes(.);getTaxes(.);TaxBdaptorTaxBdaptor adaptor;adaptor;adaptor=new adaptor=new TaxBAdaptorTaxBAdaptor();();adaptor.adaptor.getTaxes(.);getTaxes(.);接口统一了,但是代码还是和具体的类耦合!继续想方法!4 4。创立适配器的抽象来屏蔽不同的适配器。创立适配器的抽象来屏蔽不同的适配器ITaxCalculatorAdaptor adaptor;ITaxCalculatorAdaptor adaptor;adaptor=new TaxAAdaptor();adaptor=new TaxAAdaptor();adaptor.getTaxes(.);adaptor.getTaxes(.);ITaxCalculatorAdaptor adaptor;ITaxCalculatorAdaptor adaptor;adaptor=new TaxBAdaptor();adaptor=new TaxBAdaptor();adaptor.getTaxes(.);adaptor.getTaxes(.);现在,就剩红色字体处要出来啦继续想方法!6 6 4 4 用用GoFGoF设计模式设计用例实现设计模式设计用例实现1.1.适配器模式适配器模式问题:如何解决接口不兼容的问题或为不同问题:如何解决接口不兼容的问题或为不同接口但相似的组件提供一个稳定的接口?接口但相似的组件提供一个稳定的接口?解决方案:通过一个中间的适配器对象将组解决方案:通过一个中间的适配器对象将组件的原来接口转换为另一个接口。件的原来接口转换为另一个接口。4 4 用用GoFGoF设计模式设计用例实现设计模式设计用例实现-适配器模式适配器模式适配器模式类图 7 7 8 4 4 用用GoFGoF设计模式设计用例实现设计模式设计用例实现-适配器模式适配器模式SAPAccountingAdaptor负责将postSale接口适配成外部效劳的接口clientAdapterAdaptee有一个类(adaptee)实现了数学中的幂次运算,方法中需要传入两个参数,一个是基数base,另外一个是幂次exp。现在客户端需要一个求得一个数的平方的函数接口(target),传入一个数,得到它的平方值。请应用适配器模式进行设计,绘制类图。9 9 10 4 4 用用GoFGoF设计模式设计用例实现设计模式设计用例实现2 2工厂模式工厂模式2.2.工厂模式工厂模式考虑:在前面外部效劳适配器解决方案中,考虑:在前面外部效劳适配器解决方案中,谁去负责创立这些适配器?谁去确定要创谁去负责创立这些适配器?谁去确定要创立的是哪个适配器,是立的是哪个适配器,是TaxMasterAdapter TaxMasterAdapter 还是还是GoodAsGoldTaxProAdapterGoodAsGoldTaxProAdapter?让领域类如让领域类如SaleSale来创立适配器对象是来创立适配器对象是否适宜?否适宜?-如此那么领域类不只是包含应如此那么领域类不只是包含应用逻辑了!用逻辑了!一个设计原那么:设计要保证别离不相关一个设计原那么:设计要保证别离不相关的事物。别离不同的事物到不同的领域,的事物。别离不同的事物到不同的领域,从而使得别离的各局部能到达高内聚的设从而使得别离的各局部能到达高内聚的设计目标。计目标。5 5。应用工厂模式来屏蔽具体适配器。应用工厂模式来屏蔽具体适配器ITaxCalculatorAdaptor adaptor;ITaxCalculatorAdaptor adaptor;ServiceFactory factory=new ServiceFactory();ServiceFactory factory=new ServiceFactory();adaptor=factory.getTaxCalculatorAdaptor();adaptor=factory.getTaxCalculatorAdaptor();adaptor.getTaxes(.);adaptor.getTaxes(.);现在,代码彻底和具体的适配器类无关啦6 6。工厂中如何与具体适配器类解耦。工厂中如何与具体适配器类解耦1 1具体用哪个适配器?用属性来记录具体用哪个适配器?用属性来记录System.setProperty(name,zhouchunyan)System.setProperty(name,zhouchunyan)System.setProperty(ITaxCalculatorAdaptor.class.name,System.setProperty(ITaxCalculatorAdaptor.class.name,TaxAAdaptor);TaxAAdaptor);2 2工厂中的工厂中的getTaxCalculatorAdaptorgetTaxCalculatorAdaptor与具体适配器解耦与具体适配器解耦ITaxCalculatorAdaptor getTaxCalculatorAdaptor()ITaxCalculatorAdaptor getTaxCalculatorAdaptor()if(taxCalculatorAdaptor=null)if(taxCalculatorAdaptor=null)String String className=System.getProperty(ITaxCalculatorAdaptor.class.name);className=System.getProperty(ITaxCalculatorAdaptor.class.name);taxCalculatorAdaptor=Class.forname(className).newinstance()taxCalculatorAdaptor=Class.forname(className).newinstance()return taxCalculatorAdaptor;return taxCalculatorAdaptor;13 4 4 用用GoFGoF设计模式设计用例实现设计模式设计用例实现2 2工厂模式工厂模式问题:当考虑某些特殊情况时,如复杂的创问题:当考虑某些特殊情况时,如复杂的创立逻辑、希望别离创立职责以产生更好的内立逻辑、希望别离创立职责以产生更好的内聚度等,谁应该负责创立对象?聚度等,谁应该负责创立对象?解决方案:创立一个名为工厂的纯虚构对象解决方案:创立一个名为工厂的纯虚构对象来处理创立。来处理创立。工厂类ServiceFactory负责创立第三方财务适配器、库存适配器、税金计算器。if(taxCalculatorAdapter=null)/创立某一税率计算器对象赋值给创立某一税率计算器对象赋值给 /taxCalculatorAdapter;return taxCalculatorAdapter;返回值类型?返回值类型?类型?类型?getTaxCalculatorAdapter():返回类型是返回类型是TaxMasterAdaptor还是还是 GoodAsGoldTaxProAdaptor?还是?还是 14 4 4 用用GoFGoF设计模式设计用例实现设计模式设计用例实现2 2工厂模式工厂模式注意:工厂方法返回对注意:工厂方法返回对象的类型是接口,而不象的类型是接口,而不是类,这样工厂方法就是类,这样工厂方法就可以返回接口的任何实可以返回接口的任何实现。现。注意:在serviceFactory中,决定哪个类的实例被初始化是从外部数据源读入类名如在java中可使用系统属性,然后动态装载此类来实现的。if(taxCalculatorAdaptor=null)if(taxCalculatorAdaptor=null)String className=System.getProperty(taxCalculator.class.name);String className=System.getProperty(taxCalculator.class.name);taxCalculatorAdaptor=taxCalculatorAdaptor=(ITaxCalculatorAdaptor)Class.forName(className).newInstance();(ITaxCalculatorAdaptor)Class.forName(className).newInstance();return taxCalculatorAdaptor;return taxCalculatorAdaptor;15 4 4 用用GoFGoF设计模式设计用例实现设计模式设计用例实现2 2工厂模式工厂模式补充补充依赖倒置原那么依赖倒置原那么(DIP)(DIP)告诉我们应该优先依赖于抽象类,告诉我们应该优先依赖于抽象类,而防止依赖于具体类。当这些具体类不稳定时,更应该而防止依赖于具体类。当这些具体类不稳定时,更应该如此。如此。因此,下面的代码违反了这个原那么因此,下面的代码违反了这个原那么Circle c=new Circle();Circle c=new Circle();16 4 4 用用GoFGoF设计模式设计用例实现设计模式设计用例实现2 2工厂模式工厂模式改进:工厂模式允许我们只依赖于抽象接口就能创立出改进:工厂模式允许我们只依赖于抽象接口就能创立出具体类的实例。具体类的实例。public interface ShapeFactory public Shape make(String shapeName)throws Exception;17 4 4 用用GoFGoF设计模式设计用例实现设计模式设计用例实现2 2工厂模式工厂模式public class ShapeFactoryImplementat
展开阅读全文
温馨提示:
金锄头文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
相关搜索

当前位置:首页 > 中学教育 > 教学课件 > 高中课件


电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号