设计模式
书生杨阳
好好学习,天天向上
展开
-
单例模式
单例模式有两种表现形式:饿汉式单例类 (类加载时直接初始化实例,所以饥饿) 实例代码:public class Singleton { //在类加载时生成实例 private static Singleton instance = new Singleton(); //私有化构造函数 private Singleton(){} //通过该方法获得实例引用原创 2016-05-06 18:41:35 · 875 阅读 · 0 评论 -
状态模式(行为型)
状态模式(State Pattern) 又称为状态对象模式,该模式允许一个对象在其内部状态改变时改变其行为.设计场景: 你看电视机时需要频繁变更不同频道,如何设计?此时有三个对象: 人Person,电视机TV,频道Channel.我们只能调用TV对象的public方法来切换不同的频道,比如调用TV对象的toCCTV1()方法切换到cctv1; 代码实现时你会想直接在TV对象的每一个换频道方法中n原创 2016-06-16 00:08:19 · 754 阅读 · 0 评论 -
中介者模式(行为型)
中介者模式:用一个中介对象封装一系列对象的交互,中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立的改变它们之间的交互.按照我的理解: 中介者模式类似婚姻介绍所,想象自己去婚姻中介所的过程:我们要去婚姻中介所找对象时,首先要将自己的信息登记到婚姻中介所,然后由中介所帮我们按照条件找匹配对象,应该不会自己去找匹配对象吧,(所以就符合中介者模式定义中的:各对象不需要显式地相互作用,从原创 2016-06-16 18:28:56 · 763 阅读 · 0 评论 -
备忘录模式(行为型)
备忘录模式(Memento Pattern),又称为快照(snapshot)模式,或Token模式; 备忘录模式定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存该状态.这样,以后就可以将该对象恢复到原先的状态. 如:联机事务处理时,需要对原子操作前的状态备份一下,以便原子操作失败时能回滚,因此需要用到备忘录模式;实例:系统需要对一个文档对象的不同状态进行备份,以便后期可以原创 2016-06-16 11:21:04 · 718 阅读 · 0 评论 -
23种设计模式分类
设计模式总共分为三类:1、创建型,2、结构型,3、行为型 1. 创建型设计模式包含: (1)单例模式 (2)工厂方法模式,实例url: (3)抽象工厂模式,实例url: (4)创造者模式,实例url: (5)原型模式,实例url: 2. 结构型设计模式包含: (1)代理模式,实例url: (2)原创 2016-05-06 17:34:16 · 1403 阅读 · 0 评论 -
享元模式(结构型)
思考问题:设计一个围棋游戏,模拟一个下棋动作,如何设计? 解答:很直接的,我们会设计一个棋盘类Chessboard,一个棋子类Chesspiece,每下一枚棋子时就new一个棋子对象(传入颜色、位置),然后将这些棋子装入到一个容器中。这种简单粗暴的方式确实是解决了问题,但你会发现,棋子永远只有黑白色,棋子对象的函数都是一样的, 主要的变化只是(x,y)位置而已,那能不能单独把(x,y)独立出来,让原创 2016-05-08 16:27:02 · 1018 阅读 · 0 评论 -
策略模式(行为型)
思考问题: 一个书店的某类书是免费的,某类书是固定1元的,某类书是按折扣算的(比如88%)。假定顾客只买一类书,在设计书店BookStore类时应该如何计算顾客买书的费用?解答: 1. 你有可能不知道如何设计,毕竟上面的计算规则不一样(并不是一类书8折另一类书9折那样好计算); 2. 既然这样,我们就定义一个接口(策略接口),规定一个方法(strategyInterface())为计算金额的方原创 2016-05-08 11:02:36 · 835 阅读 · 0 评论 -
外观模式/Facade模式(结构型)
思考问题:老板告诉秘书要到上海出差10天;老板告诉秘书要请8个人吃饭。如何设计?解答: 1. 根据面相对象的思维,应该有一个Boss类,和Secretary秘书类,除此之外,还要有宾馆类Hotel,机场类Airport,酒店类Restaurant、司机类Chauffeur。 2. Boss对象只是跟秘书交谈而不是亲自去订机票和订房间等,所以机场类、酒店类、宾馆类和司机类四个组成一个子系统集,秘书原创 2016-05-07 23:59:18 · 3056 阅读 · 0 评论 -
观察者模式(行为型)
思考问题:在网上书店买一本书,当你支付成功后,会计需要开具发票,同时出纳员需要登记入账,同时配送员需要发货,如果由你来设计该下单业务,你应该如何设计?解答: 1. 直接的,我们将设计书本类,会计类,出纳员类,配送员类,然后再里面添加相应的方法。 2. 当书本被购买成功(假设是sales方法)时,在sales方法内手动编码调用会计员的开发票方法、调用出纳员登记入账方法、调用配送员的配送方法,即可完原创 2016-05-07 22:36:03 · 918 阅读 · 0 评论 -
原型模式(创建型)
思考问题:如何快速复制出一个属性相同的对象(内存地址不同)? 解答:clone方法,也就是原型模式(逼格很高)。clone方法有两种方式:浅克隆深克隆浅克隆与深克隆的区别: 1. 浅克隆用于只包含基本数据类型或String属性的类中; 2. 深克隆用于至少包含一个非基本数据类型(除String类型)属性的类中。比如存在Date类型的属性时就应该考虑深克隆; 3. 实现上的区别:浅克隆原创 2016-05-07 17:58:13 · 1066 阅读 · 0 评论 -
责任链模式(行为型)
思考问题:(模拟班游集体请假),学校规定:对于班游,学生提交的申请表,必须经过辅导员、系主任、院长、校长签名确认才能出游,现在由你来设计该业务模型模拟该需求,应该如何设计? 解答:很直观的一种想法:我直接设计一个学生类、一个申请单类RequestNote、一个辅导员类、一个系主任类、一个院长类、一个校长类,然后为每个类添加审核方法verify(RequestNote rn); 然后设定规则:原创 2016-05-07 14:49:14 · 894 阅读 · 0 评论 -
适配器模式(结构型)
思考问题:对于遗留系统,service已经存在了,controller层却假定service层会提供add(User u)方法新增用户,而实际上service层声明的却是insert(User u)来新增用户,在controller层和service层对接时才发现该问题,在不修改已有代码的前提下,你该如何完成对接?解答:有两种方式:继承;组合(不理解可以继续看下去);首先讲大家熟悉的继承方式,结原创 2016-05-07 02:21:13 · 3458 阅读 · 0 评论 -
代理模式之动态代理(结构型)
前面介绍了静态代理,这是理解动态代理的一个比较基础的东西。 思考问题:当你需要为100个或更多的不同的类记录日志或检查权限时,你是否还会采用静态代理模式?(不累吗?)该如何解决?解答:希望有一个通用的产生代理对象的类(Proxy),它能提供一个方法帮我们动态产生代理类,这就是动态代理,实现同样的代理功能,但减少了代理类。 这篇博客描述的挺小白易懂的,大家看一下吧: url:http://www原创 2016-05-07 00:59:14 · 556 阅读 · 0 评论 -
代理设计模式(结构型)
思考问题:别人面向UserDao接口写好的类(UserDaoImpl)(你不得修改别人代码),你需要对这个类的方法记录日志或检查权限以确定其他调用者是否有权限使用该方法时你该怎么设计?(或记录调用日志)解答:自己设计一个日志类(UserDaoLogProxy),将UserDao组合进去(就是UserDaoLogProxy添加一个UserDao属性),然后添加与UserDao类的方法名相同的所有方法,原创 2016-05-07 00:21:32 · 3211 阅读 · 0 评论 -
抽象工厂模式
思考问题:一个工厂不仅计划生产汽车,也计划生产电视,不确定具体工厂、具体汽车品牌、具体电视品牌,如何设计?个人解答:设计一个抽象工厂,里面提供两个方法,一个声明是生产汽车的,另一个声明是生产电视的。所以还需要定义汽车接口和电视接口;抽象工厂模式与工厂模式的区别: 1. 抽象工厂模式是工厂方法的更高层次的抽象,它将不同工厂方法整合在一个类中,比如抽象工厂模式的工厂类中可能生产多系列物品(比如汽车和原创 2016-05-06 22:58:03 · 2314 阅读 · 0 评论 -
工厂方法模式
思考问题:一个工厂生产汽车,在不知道具体工厂和具体汽车品牌时应该如何设计? 答案:工厂方法模式。定义一个工厂接口和汽车接口,然后在工厂接口中声明一个factory工厂方法,传入参数用于决定需要生产的汽车的类型。 声明汽车工厂接口:package com.shusheng.factoryMethodModel;/**抽象工厂*/public interface CarFactoryI {原创 2016-05-06 20:43:06 · 1125 阅读 · 0 评论 -
设计模式 之 六大设计原则
设计原则单一职责原则(SRP,single responsibility principle)定义:一个类,应该只有一个引起它变化的原因:即一个类应该只有一个职责。优点: 1. 降低类的复杂性 2. 提高类的可读性 3. 提高代码的可维护性和复用性 4. 降低因变更引起的风险里氏替换原则(Liskov Substitution Principle)定义:子类可以替换父类的位置...原创 2019-02-17 16:27:51 · 275 阅读 · 0 评论