![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
设计模式
多懂一些
尽可能的让自己多懂一些,你才能看懂事物的本质!
展开
-
学习设计模式-简单工厂模式
简单工厂需求:客户A需要开车,今天他跟你说要开奥迪车,明天要开奔驰车,后天要开宝马…解决方式:a. 一个开车父类,定义一个开车方法;b. 分别定义子类开奥迪车、开奔驰车、开宝马车;(继承)c. 一个工厂,分别根据输入参数,实例化对应的子类对象;(多态);d. 客户A类声明父类,输入对应的参数,工厂类实例化对应的子类,调用子类的开车方法原创 2017-02-24 14:33:02 · 193 阅读 · 0 评论 -
学习设计模式-单例模式
说明:(定义)仅保证一个类仅有一个实例,并提供一个访问他的全局访问点。重点是构造方法私有化,对象实例化要全局化。(分为懒汉式[在全局访问点根据判断是否存在实例再来实例化对象]和饿汉式[在声明字段的时候就实例化对象])需求:商品库存锁定和释放,由于商品库存的修改是多线程操作的,所以需要线程同步解决方式:a. 定义一个单例类;b. 定义一个私有的自身对象(在这里实例原创 2017-03-31 11:09:26 · 144 阅读 · 0 评论 -
学习设计模式-原型模式
说明:通过原型模式可以自动复制一个实例化对象A给新的对象实例化对象B,这样可以省去很多实例化、重复代码的工作,便于维护。[克隆分为浅克隆和深克隆,浅克隆只克隆基础类型信息,对于类似对象这样的复杂类型信息,只克隆这个对象的引用;深克隆是基础类型和复杂类型都克隆其值,而不仅仅是克隆引用]需求:复制简历,需要实例化两个简历对象解决方式:a. 声明一个抽象类b. 定义两原创 2017-03-24 16:31:15 · 151 阅读 · 0 评论 -
学习设计模式-模版方法
说明:把一定层次具有相同操作,但在更细层次有细微不同时,我们可以抽象这些相同的操作到父类,不同的操作延迟到子类实现。需求:类似于抄试卷和答题,抄试卷是相同操作,但答题的答案是不同操作。现在A、B都要抄试卷并答题。解决方式:a. 定义一个抽象模版类,声明不同操作方法,将相同的操作定义成模版方法(方法内调用不同操作方法)。b. 定义模版类子类不同操作类,实现不同方法原创 2017-03-24 16:32:46 · 180 阅读 · 0 评论 -
学习设计模式-外观模式
说明:为多个子系统接口,提供一个一致的接口,用到的地方有种:a. 在设计初期有意识将不同层分离,例如三层架构,持久化层、业务层、表示层,业务层将持久化层细节处理,表示层直接调用业务层即可;b. 在开发阶段,子系统往往重构而变得复杂,这个时候增加外观模式,减少他们直接的依赖;c. 维护阶段,对于某些系统已经难以维护和扩展了,可以使用外观模式,对老系统功能进行原创 2017-03-24 16:33:45 · 161 阅读 · 0 评论 -
学习设计模式-观察者模式
说明:如果你需要将一个复杂的对象或功能的构建流程和表示分离,使得同样的构建流程,也可以创建出不同的表示,例如麦当劳做炸东西,炸东西的流程是一样的,但放入的材料不同,炸出来的东西不一样(例如鸡排、鸡腿、鸡翅等)需求:用户要个炸鸡腿解决方式:a.定义一个产品类(炸东西);b.定义一个构建产品部分或过程的抽象类(炸东西的步骤);c.分别根据需求不同原创 2017-03-27 11:32:59 · 169 阅读 · 0 评论 -
学习设计模式-命令模式
说明:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。(本质是将一个请求响应进行请求、命令、接收拆分解耦,是对功能方法的一种抽象。)需求:饭店点菜吃饭解决方式:a. 定义一个命令接口,且声明一个执行命令方法;b. 定义一个命令接收者类,声明一个具体的操作方法;(做菜的厨师)c.原创 2017-05-06 17:00:09 · 202 阅读 · 0 评论 -
学习设计模式-中介者模式
说明:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。(缺点,中介类需要管理所有同事实现类)需求:国家与国家通信解决方式:a. 定义中介者抽象,定义通信方法;b. 定义同事抽象方法,声明中介者,构造注入中介者,定义发消息抽象方法;c. 定义中介者实现类,声明同事实现1、2原创 2017-05-06 17:01:01 · 270 阅读 · 0 评论 -
学习设计模式-享元模式
说明:运用共享技术有效地支持大量细粒度的对象。(连接池、线程池)需求:数据库连接池解决方式:a. 定义一个享元抽象类,定义抽象类的方法;b. 分别定义享元对象的共享具类、非共享具体类;c. 定义一个享元工厂类,声明享元的map(Hashtable线程安全),获取享元方法(这里面可以通过判断map的大小来判断是否初始化享元对象);需求变更:连接池原创 2017-05-06 17:02:16 · 223 阅读 · 0 评论 -
学习设计模式-解释器模式
说明:定义一些语法规则,然后定义一个解析器去解析该语法。(正则匹配)需求:编写音乐解释器解决方式:a. 定义一个上下文类;b. 定义表达式抽象类,定义解释方法;c. 分别定义表达式具体类、表达式具体类2,实现各自的解释方法;d. 定义一个客户端,实例化上下文、通过上下文内容判断实例化表达式具体类、表达式具体类2,执行其解释方法。需原创 2017-05-06 17:03:05 · 185 阅读 · 0 评论 -
学习设计模式-访问者模式
说明:表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。需求:不同事情(访问者),男女(元素)态度不一样解决方式:a. 定义一个元素抽象类,定义一个接收方法,传入形参访问者的抽象方法;b. 分别定义元素实现A、B,实现其接收方法;(男女)c. 定义一个访问者抽象类,定义访问A、B方法,分别传原创 2017-05-06 17:03:57 · 220 阅读 · 0 评论 -
学习设计模式-桥接模式
说明:将抽象部分(多种变化)与它的实现(多种变化)部分分离,使它们都可以独立的变化。(当多角度去实现抽象类时,如果通过继承,会造成大量的类增加,此时需要用桥接模式。)需求:手机品牌跟手机软件,不同品牌手机有多个软件。一个品牌手机有通讯录软件、播放音乐软件,还有其他等软件;另一个品牌有播放音乐软件和打电话软件。解决方式:a. 分别定义抽象类(品牌手机)、实现类(品牌手机软件),原创 2017-05-06 16:59:23 · 194 阅读 · 0 评论 -
学习设计模式-迭代器模式
说明:(定义)提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露该对象的内部表示。(java 的for语法就是一个迭代器模式)需求:按索引从小到大遍历一个集合解决方式:需求变更:按索引从大到小遍历一个集合 解决方式:a. 定义一个迭代器接口,分别定义第一个、下一个、是否结束、下一个方法;b. 定义一个迭代器具体类,原创 2017-03-31 10:32:00 · 144 阅读 · 0 评论 -
学习设计模式-组合模式
说明:(定义)将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。(关键点提现层次结构但他们有一致性操作,它有透明方式和安全方式,区别在于透明方式新增/删除子节点的方法有没有,有就是透明方式,没有则为安全方式,通常用透明方式。)需求:现在对文件夹枝节点杀毒,文件夹枝节点里面有文件叶子.txt,文件夹2,文件夹2里面有文件叶子.png。解原创 2017-03-30 17:02:28 · 203 阅读 · 0 评论 -
学习设计模式-抽象工厂模式
说明:(定义)提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。缺点,一次变更,需要修改多个工厂类。需求:现在要造奔驰车、宝马车,其中发动机、底盘均有不同的型号,奔驰需要发动机A,底盘A;宝马需要发动机B,地盘B。解决方式:a. 分别定义发动机、地盘的抽象类或接口,并分别定义发动机A\B,地盘A\B具体类;b. 定义造车工厂抽象类或接口,分别定原创 2017-03-28 10:47:25 · 143 阅读 · 0 评论 -
学习设计模式-状态模式
说明:(定义)当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类。该模式适用于那些复杂的条件不一样,执行不一样的场景,当然简单的情况,直接用if/else处理就可以了。需求:员工加班,不同的时间,写程序的效率不一样。解决方式:a. 定义一个状态抽象类并定义一个处理方法;b. 根据不同状态,定义不同状态具体类;c. 定义一个上下文原创 2017-03-28 15:33:19 · 162 阅读 · 0 评论 -
学习设计模式-适配器模式
说明:(定义)将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。需求:笔记本要220V电压,但工业电是380V,为了让笔记本能正常启动解决方式:a. 定义一个目标类\抽象类\接口(输出220V);b. 定义一个需要被适配的类(输出380V);c. 定义一个适配器类,继承目标类,声明原创 2017-03-29 13:57:39 · 142 阅读 · 0 评论 -
学习设计模式-备忘录模式
说明:(定义)在不破坏封装性的前提下,捕获一个对象内部状态,并在对象之外保存这个状态。这样以后就可以将该对象恢复到原来的模样。需求:购买商品时,保存商品购买时的信息,以便用户可以通过快照功能查看商品以前的信息。解决方式:a. 定义一个备忘录类(商品信息);b. 定义一个备忘录管理类,用于存储备忘录当前状态的信息(商品信息数据快照);c. 定义一个发原创 2017-03-29 13:58:19 · 149 阅读 · 0 评论 -
学习设计模式-装饰模式
装饰模式说明:这里主要的思想是,实现类无需关注何时使用他,只用关注他该做什么,技巧是装饰类,声明了自身父类的对象,并声明装饰方法(带参,子类对象),将子类对象复制给父类,然后重写父类方法,调用父类对象方法。【装饰类的作用就是将子类变成父类,子类重新父类业务方法,并调用父类业务方法】需求:给人穿衣服,支持自由搭配衣服,调用顺序在客户端控制解决方式:a. 声明一个合成类(父类原创 2017-03-23 09:36:29 · 213 阅读 · 0 评论 -
学习设计模式-代理模式
代理模式说明:为真实对象提供一种代理已控制对这个对象的访问【真实对象的代表】需求:远程代理[应用程序调用外部web]、虚拟代理[浏览器图片展示]、安全代理[控制真实对象访问权限]、智能指引[调用真实对象时,代理处理额外的一些事]解决方式:a. 声明接口,定义代理和真实对象的共同方法;b. 真实类c. 代理类,声明真实类,构造方法实例化真实类;重原创 2017-03-23 11:23:47 · 125 阅读 · 0 评论 -
学习设计模式-工厂方法模式
说明:工厂方法跟简单工厂的区别在于简单工厂方法在构造的时候,通过判断输入参数,实例化不同车对象,而工厂方法新增不同车的工厂,客户端在调用的时候控制实例化哪个车工厂。需求:跟简单工厂模式一样,要开不同的车解决方式:a. 一个开车父类,定义一个开车方法;b. 分别定义子类开奥迪车、开奔驰车、开宝马车;(继承)c. 一个工厂父类;d. 根据原创 2017-03-23 11:24:46 · 152 阅读 · 0 评论 -
学习设计模式-策略模式
策略模式说明:策略模式需求跟简单工厂很类似,但优点是可以做到更低耦合,对外只暴露了策略上下文类需求:超市有很多商品收费方法,有满减、打折等解决方式:a. 一个策略父抽象类,定义一个算法方法;b. 分别定义子类策略类A、策略类B、策略类C;(继承)c. 策略上下文类,构建方法,根据参数,实例化不同的策略类,并赋值给类声明的原创 2017-03-01 12:17:33 · 220 阅读 · 0 评论 -
学习设计模式-建造者模式
说明:如果你需要将一个复杂的对象或功能的构建流程和表示分离,使得同样的构建流程,也可以创建出不同的表示,例如麦当劳做炸东西,炸东西的流程是一样的,但放入的材料不同,炸出来的东西不一样(例如鸡排、鸡腿、鸡翅等)需求:用户要个炸鸡腿解决方式:a. 定义一个产品类(炸东西);b. 定义一个构建产品部分或过程的抽象类(炸东西的步骤);c. 分别根据需求不同原创 2017-03-30 10:16:33 · 130 阅读 · 0 评论 -
学习设计模式-责任链模式
说明:使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。需求:请假审批解决方式:a. 定义一个处理者抽象类,声明处理方法,定义一个处理者类,定义设置下个处理者的方法;b. 分别定义处理者实现类、处理者实现类2,定义处理方法(判断是否能处理,如果不能,给下个处理者执行原创 2017-05-06 17:07:48 · 237 阅读 · 0 评论