设计模式学习总结一_第1页
设计模式学习总结一_第2页
设计模式学习总结一_第3页
设计模式学习总结一_第4页
设计模式学习总结一_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、-. z.前言:推荐几本相关的书:1Head First Design Patterns曾经买Head First系列的时候买的一本书,是java语言的案例,但是完全不影响你了解设计模式。这系列的书就是有很多图,做快速了解建议买。2大话设计模式1个月前买的,看作者简介是名教师,里面就是菜鸟和大鸟的对话举出很多例子,案例也相当不错。这本书最起码让我感觉特别不错。3重构与模式这本是必须要看的一本书,前几*讲了什么是重构,什么是模式。然后两者之间的关系。后边是是讲设计模式的动机,做法,实例,变体。也不分什么创立,行为,构造什么的。最后一章是重构的实现。一设计原则单一职责原则告诉我们实现类要职责单一;

2、里氏替换原则告诉我们不要破坏继承体系;依赖倒置原则告诉我们要面向接口编程;接口隔离原则告诉我们在设计接口的时候要精简单一;迪米特法则告诉我们要降低耦合。而开闭原则是总纲,他告诉我们要对扩展开放,对修改关闭。1.开闭原则OCP(Open-Close Principle)【开指的是对扩展开放,关指的对修改关闭。】我把它理解为一国两制原则。一国两制怎么说:*澳门继承了中国这个类,表示说:一个中国不可改变,但针对与港澳实际情况,他们实行的是资本主义经济。2.单一职责原则RRPSingle Responsibility Principle【一个类应该只有一个发生变化的原因。】高内聚低耦合这就是我们写程序

3、的目标,但是很多时候高耦合会在不经意间就产生了,这大多是因为职责扩散造成的。这个原则最好理解,又最容易违背这个原则。原因就是职责这个家伙不好确认。3.依赖倒转原则DIP(Dependency Inversion Principle)【抽象不应当依赖于细节,细节应当依赖于抽象;高层实现不依赖底层实现。】想想让你封装一个类的时候你首先会做什么。会先封装接口,再写实现。#总工说这样处理才是合理的。原因就在这#。面向接口编程而非实现。这个原则在我看来也是面向对象设计的标志。举个例子:usb是不是所有的的电脑都能通过usb接口连接。如果联想的usb接口和苹果的usb接口不一样,则你买了一个200多的US

4、B键盘,结果是不是就不能公用了。4.里氏代换原则Liskov Subsitution Principle(LSP)【子类可以扩展父类的功能,但不能改变父类原有的功能】里氏代换原则是对开-闭原则的补充。实现开-闭原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规*。有这么一句话:里氏代换原则是继承复用的一个根底。检验你是否遵循了里氏代换原则的方法:如果调用的是父类的话,则换成子类也完全可以运行。动物dongwu=new 猫;其中【把猫换成狗】也是正常的就说明你是遵循这个原则的。注:我在网上看过一个企鹅是鸟不会飞的例子,这也是自己犯这

5、个错误的原因。这例子在这不说了,你可以试着去找一下去。5.接口隔离原则Interface Segregation Principle(ISP)从字面上来讲就是一个不要把接口写的太臃肿。查资料大致说的就是有两种别离方式一种是定制效劳和角色隔离。在工作当中有没有这样的问题存在:同一个模块,因为没有安排得当两个人都去开发,最后一定是有个人白做了。所以有时候,工程管理软件就显的则的有必要。定制效劳:大致来讲就是我针对一个客户端,我的一些方法放到一个接口里,另一个客户端我的一个类放在另一个接口里面。角色隔离:是指一个客户端有多个方法,多个方法写多个接口。【友情提醒:接口也不要分的太细,要不然结果就是接口

6、太多。】6.迪米特原则Law of Demeter又称Least Knowledge Principle(LKP)最少知识原则【我的理解就是:这个原则不希望类与类之间不要建立直接联系。】简单来说就是不和陌生人说话。类与类之间一定会存在互相调用的?网上查了一下,说可以用友元类来转达。降低类本身和成员的访问权限,到达【低耦合,高内聚】是其目的。【和ISP接口隔离原则一样,限制类与类之间的通信。ISP限制的是宽度,而LoD迪米特原则限制的是通信的广度和深度。】。外观模式Facade Pattern)和中介者模式Mediator Pattern就使用了迪米特法则。一设计模式【创立型的设计模式】1.单例

7、模式原则:确保一个类只有一个实例,并提供一个全局访问点举例:打印机就是最好的例子,打印就是纸打印一个对象多的话就进展排队。主要解决:一个全局使用的类频繁地创立与销毁。优点:1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创立和销毁实例比方管理学院首页页面缓存。2、防止对资源的多重占用比方写文件操作。缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。/懒汉模式publicclass SingletonClassprivatestatic SingletonClass instance=null;publicstaticsynchroniz

8、edSingletonClass getInstance()if(instance=null instance=new SingletonClass(); return instance; private SingletonClass() /饿汉式/对第一行static的一些解释/ 允许我们在一个类里面定义静态类。比方内部类nested class。/把nested class封闭起来的类叫外部类。/我们不能用static修饰顶级类top level class。/只有内部类可以为static。publicclass Singleton/在自己内部定义自己的一个实例,只供内部调用private

9、static final Singleton instance = new Singleton();private Singleton()/do something /这里提供了一个供外部访问本class的静态方法,可以直接访问publicstatic Singleton getInstance()return instance; / 双重锁的形式。publicclass Singletonprivatestatic Singleton instance=null;private Singleton()/do something publicstatic Singleton getInstan

10、ce()if(instance=null) synchronized(Singleton.class)if(null=instance) instance=new Singleton(); return instance; 1.简单工厂模式原则:封装改变,既然要封装改变,自然也就要找到改变的代码,然后把改变的代码用类来封装和降低对象之间的耦合度举例:夏天到了,去撸串的季节到了。老板来10个板筋,5个腰子,20个串,10个鸡胗。一会老板就给你上来了。这就是工厂模式。老板烤串就是工厂,你和你的兄弟们就是顾客。只需要照着单子点即可,不需要知道老板具体是怎么做的。主要解决:主要解决接口选择的问题。优点

11、:1、一个调用者想创立一个对象,只要知道其名称就可以了。2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。3、屏蔽产品的具体实现,调用者只关心产品的接口。缺点:每次增加一个产品时,都需要增加一个具体类和对象实现工厂,使得系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事。/单位信息工厂模式/publicclass unit_factory publicstatic unit create_unit_factory(string unitname) unit unit = null;switch (unitname) caseroom

12、: unit = new unti_rooms();break; casefloor: unit = new unti_floor();break; casebuilding: unit = new unti_building();break; casearea: unit = new unti_areas();break; return unit; /单位信息基类/publicclass unit : w*_sbs_redis public fee_power_query fee_power_query;publicvirtual result get_info() result ret =

13、 null;return ret; /楼称派生类/class unti_floor : unit string sign = fee_power_id + | + fee_power_query.uid + | + fee_power_query.area_id + | + fee_power_query.building_id + | + fee_power_query.cardno + | + fee_power_query.code;if (!fee_power_query.valid_floors()return Result(int)errcode.Interval

14、, fee_power_query.msg); List list = new List();var recents = new fee_recents().pick(fee + fee_power_query.uid, power_floor);var ret = new w*webapi().invoke(i = i.floors, gatapower);return ret; /房间派生类/class unti_rooms : unit /楼派生类/class unti_building : unit /校区派生类/class unti_areas : unit 1.工厂模式原则:一个用

15、于创立对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延迟到其子类。他强调的是单个对象的变化。【工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式】举例:2.抽象工厂模式上面说到工厂模式,有一个问题,就是实现的调用要依赖于工厂类,如果扩展程序要修改工厂类,则这样就违背了开闭原则。为此用到了抽象工厂模式。其实说道设计原则,抽象工厂模式更能表达的是里氏代换原则。主要解决:主要解决接口选择的问题。原则:为创立一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。强调的是系列对象的变化。优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始

16、终只使用同一个产品族中的对象。缺点:产品族扩展非常困难,要增加一个系列的*一产品,既要在抽象的 Creator 里加代码,又要在具体的里面加代码。/抽象工厂类,提供创立两个不同地方的鸭架和鸭脖的接口/publicabstractclass AbstractFactory / 抽象工厂提供创立一系列产品的接口,这里作为例子,只给出了绝味中鸭脖和鸭架的创立接口publicabstract YaBo CreateYaBo();publicabstract YaJia CreateYaJia(); /*绝味工厂负责制作*的鸭脖和鸭架/publicclass NanChangFactory : Abst

17、ractFactory / 制作*鸭脖publicoverride YaBo CreateYaBo() returnnew NanChangYaBo(); / 制作*鸭架publicoverride YaJia CreateYaJia() returnnew NanChangYaJia(); /*绝味工厂负责制作*的鸭脖和鸭架/publicclass ShangHaiFactory : AbstractFactory / 制作*鸭脖publicoverride YaBo CreateYaBo() returnnew ShangHaiYaBo(); / 制作*鸭架publicoverride Y

18、aJia CreateYaJia() returnnew ShangHaiYaJia(); /鸭脖抽象类,供每个地方的鸭脖类继承/publicabstractclass YaBo /打印方法,用于输出信息/publicabstractstring Print(); /鸭架抽象类,供每个地方的鸭架类继承/publicabstractclass YaJia /打印方法,用于输出信息/publicabstractstring Print(); /*的鸭脖类,因为*人喜欢吃辣的,所以*的鸭脖稍微会比*做的辣/publicclass NanChangYaBo : YaBo publicoverrides

19、tring Print() return*的鸭脖; /*的鸭脖没有*的鸭脖做的辣/publicclass ShangHaiYaBo : YaBo publicoverridestring Print() return*的鸭脖; /*的鸭架/publicclass NanChangYaJia : YaJia publicoverridestring Print() return*的鸭架子; /*的鸭架/publicclass ShangHaiYaJia : YaJia publicoverridestring Print() return*的鸭架子; /如果绝味又想开一家*的分店时,因为*喜欢吃

20、麻的/所以这是有需要有一家*的工厂专门制作/publicclass HuNanFactory : AbstractFactory / 制作*鸭脖publicoverride YaBo CreateYaBo() returnnew HuNanYaBo(); / 制作*鸭架publicoverride YaJia CreateYaJia() returnnew HuNanYajia(); /*的鸭脖/publicclass HuNanYaBo : YaBo publicoverridestring Print() return*的鸭脖; /*的鸭架/publicclass HuNanYajia :

21、 YaJia publicoverridestring Print() return*的鸭架子; 1.建筑者模式原则:将一个复杂对象的构建与它的表示别离,使得同样的构建过程可以创立不同的表示。举例:网上很多都用组装电脑来阐述建造者模式,一个电脑都有cpu,内存条,主板,硬盘。这些部件显然在创立的时候也是一个复杂的过程,但是如果我们如果要组装一台电脑是不需要知道这个过程的。只需要把兼容部件拿过来组装即可。把部件和是否兼容别离就需要用到建筑者模式。优点:1、建造者独立,易扩展。2、便于控制细节风险。缺点:1、产品必须有共同点,*围有限制。2、如内部变化复杂,会有很多的建造类。publicclass

22、 Director publicvoid Construct(IBuilder builder) builder.BuildPartA(); builder.BuildPartB(); publicinterface IBuilder void BuildPartA();void BuildPartB(); Product GetResult(); publicclass ConcreteBuilder1 : IBuilder private Product product = new Product();publicvoid BuildPartA() product.Add(部件A); pu

23、blicvoid BuildPartB() product.Add(部件B); public Product GetResult() return product; publicclass ConcreteBuilder2 : IBuilder private Product product = new Product();publicvoid BuildPartA() product.Add(部件*); publicvoid BuildPartB() product.Add(部件Y); public Product GetResult() return product; publicclas

24、s Product IList parts = new List();publicvoid Add(string part) parts.Add(part); publicstring Show() string str = string.Empty;foreach (string part in parts) str = str + part; return str; 1.原型模式原则:用原型实例指定创立对象的种类,并通过拷贝这些原型创立新的对象。举例:西游记咱们应该都看过,悟空一根毫毛能变成千千万万的孙猴子,这就和这原型模式一样。通过一个原型得到多个和原型一模一样的新对象。主要解决:在运行

25、期建立和删除原型。优点:1、性能提高。2、逃避构造函数的约束。缺点:1、配备克隆方法需要对类的功能进展通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环构造的时候。2、必须实现Cloneable 接口。3、逃避构造函数的约束。namespace Prototype/ ICloneable接口充当了抽象原型类的角色/具体原型类通常作为实现该接口的子类/publicclass PrototypeICloneable_Resume : ICloneable privatestring name;privatestring se*;p

26、rivatestring age;private WorkE*perience work;public PrototypeICloneable_Resume(string name) = name; work = new WorkE*perience(); private PrototypeICloneable_Resume(WorkE*perience work) this.work = (WorkE*perience)work.Clone(); /设置个人信息publicvoid SetPersonalInfo(string se*, string age) this.

27、se* = se*;this.age = age; /设置工作经历publicvoid SetWorkE*perience(string workDate, string pany) work.WorkDate = workDate; work.pany = pany; /显示publicstring Display() string str = string.Format(0 1 2, name, se*, age); str = string.Format(工作经历:0 1, work.WorkDate, work.pany);return str; public Object Clone

28、() PrototypeICloneable_Resume obj = new PrototypeICloneable_Resume(this.work); = ; obj.se* = this.se*; obj.age = this.age;return obj; /工作经历class WorkE*perience : ICloneable privatestring workDate;publicstring WorkDate get return workDate; set workDate = value; privatestring pany;publicstring pany get return pany; set pany = value; public Object Clone() return (Object)th

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论