
java设计模式
看了你不亏
kawaniu
这个作者很懒,什么都没留下…
展开
-
图解UML类间关系、七大设计原则
UML类间关系、七大软件设计原则非常重要但又容易混淆,鉴于文字描述略有晦涩,整理了一份解释UML中类间关系、七大设计原则的图别问为什么要把类间关系,设计原则原创 2021-05-31 21:24:57 · 436 阅读 · 1 评论 -
设计模式总结
设计模式,先是设计,后是模式,模式是设计的一套解决方案,但解决方案不限于此,在实际开发中还得是得其精髓灵活运用。整个设计模式都是围绕七大原则展开的,对这七大原则,一定要反复品位,每次都会有新的收获。本阶段学习受益颇多,对类间关系与调用有了更深刻的认识。设计模式总结中多有抽象之处,后续学习过程中会不断优化,争取一看就懂,一品就会,其中表述不当、有误的地方欢迎指出。整个学习过程下来后,感觉设计模式最难的是抽象,抽象出模型就会找到可扩展、可维护点,也就能对应到相应的设计模式,工作之余中多去尝试、多去总结,原创 2021-01-15 14:38:51 · 179 阅读 · 5 评论 -
设计模式demo类图汇总
原创 2021-01-15 12:21:17 · 1012 阅读 · 3 评论 -
行为型模式总结
原创 2021-01-15 12:17:58 · 192 阅读 · 2 评论 -
24.Iterator——迭代器模式
demo描述:学院、专业结点呈层级结构,现要遍历并输出各学院下的专业demo代码:迭代器,复则遍历专业:public class ComputerColleageIterator implements Iterator { Department[] departments; //遍历的位置 int position = 0; public ComputerColleageIterator(Department[] departments) { .原创 2021-01-13 21:47:37 · 151 阅读 · 6 评论 -
23.Memento——备忘录模式
demo描述:给游戏角色做一个备忘,以便恢复角色满血状态demo代码:备忘录管理者,根据实际情况选择备忘录类型:public class Caretaker { //一个角色只保存一次状态用它 private Memento memento; //一个角色保存多个状态用它 // private ArrayList<Memento> mementos; //多个角色保存多个状态用它 // private HashMap<Str.原创 2021-01-13 20:05:00 · 152 阅读 · 6 评论 -
22.Strategy——策略模式
demo描述:有不同种类的鸭子,它们的飞行能力不同demo代码:鸭子类:public abstract class Duck { //策略接口 FlyBehavior flyBehavior; public Duck() { } public abstract void display(); public void quack(){ System.out.println("鸭子嘎嘎叫"); } publ.原创 2021-01-13 17:13:05 · 182 阅读 · 4 评论 -
21.Visitor——访问者模式
demo描述:将人的成功失败属性分离,让这个属性以追加的方式来描述人,而不是写死在类里demo代码:人类,被访问者:public abstract class Person { //提供一个方法,让访问者可以访问(定义属性) public abstract void accept(Action action);}//--------------------------------------------------public class Man extends.原创 2021-01-13 15:09:26 · 189 阅读 · 4 评论 -
20.Mediator——中介者模式
demo描述:有咖啡机、电视、闹钟、窗帘这些同事对象,用中介者实现它们之间消息的传递,完成喝着咖啡看电视的需求demo代码:同事抽象类:public abstract class Colleague { private Mediator mediator; private String name; public Colleague(Mediator mediator, String name) { this.mediator = mediator.原创 2021-01-13 10:21:35 · 193 阅读 · 3 评论 -
19.Interpreter——解释器模式
demo描述:做一个计算器(显仅限加法和减法),输入要计算的公式然后输入要计算的数字,通过解释器将输入的数字翻译成输入公式中对应的参数demo代码:抽象类表达式:public abstract class Expression { //公式的数据部分,用参数代替各个位置数字,将输入数字解释道对应的参数上,例: //输入:a+b-c //解释后得到:HashMap{a=10,b=20,c=40} //返回内容为计算得到的结果,具体运算交个子类 pub.原创 2021-01-12 20:13:07 · 260 阅读 · 6 评论 -
18.ChainOfResponsibility——职责链模式
demo描述:现有一个借钱的请求由学校不同的领导处理,不同的领导可处理的额度不同demo代码:借钱请求:public class PurchaseRequest { private int type = 0;//请求类型 private float price = 0.0f;//请求金额 private int id = 0;//请求编号 public PurchaseRequest(int type, float price, int id) { .原创 2021-01-10 16:08:39 · 187 阅读 · 2 评论 -
17.State——状态模式
demo描述:一个抽奖活动,有扣积分、是否抽中奖品,发放奖品三个环节,不能抽奖、正在抽奖、抽中奖品、奖品发放完四个状态,不同的状态对各个环节有不同的行为demo代码:三个环节:public abstract class State { //扣积分 public void deduceMoney(){} //是否抽中奖品 public boolean raffle(){return false;} //发放奖品 public void dis.原创 2021-01-10 15:00:46 · 201 阅读 · 2 评论 -
16.Command——命令模式
demo描述:将开关灯、电视的执行与请求分离,将指令安装在遥控器上,通过遥控器发执行让执行者执行。demo代码:Receiver,命令执行者:public class TVReceiver { public void on(){ System.out.println("电视打开了"); } public void off(){ System.out.println("电视关闭了"); }}public class Li.原创 2021-01-09 20:45:54 · 261 阅读 · 4 评论 -
15.Template——模板方法
demo描述:要制作不同口味的豆浆,制作流程相同,制作期间加的料不同。将制作流程做成模板,与具体实现结合完成一个完整的制作流程demo代码:制作流程:public abstract class SoyaMilk { // 钩子方法,决定是否添加配料 boolean customerWantCondiments() { return true; } //模板方法,可以做成final,不让子类覆盖 final void make() .原创 2021-01-09 11:11:16 · 242 阅读 · 2 评论 -
14.Observer——观察者模式
demo描述:气象局实时更新天气状况,各个网站根据气象局发布的天气状况更新自己的天气状况,可能会有新的网站发布气象局更新的天气状况demo代码:管理需要气象局天气数据的类(观察者)的接口:public interface Subject { void registerObserver(Observer o); void removeObserver(Observer o); void nogifyObservers();}气象局更新天气数据:publi.原创 2021-01-09 09:51:09 · 223 阅读 · 2 评论 -
结构型模式总结
原创 2021-01-08 17:36:05 · 149 阅读 · 2 评论 -
13.Proxy——代理模式
代理模式:在不改变类的同时扩展类,在代理类中调用被代理者的方法,增加代理自己的方法,将代理类提供给外界调用,达到扩展的效果demo描述:老师有讲课的方法,在让老师讲课之前、进行时或之后要对老师的功能进行扩展,不能改老师类,可以通过加一层代理,让代理去代替老师扩展。demo代码:一、静态代理:老师接口、老师,接口中放要被代理的方法:public interface ITeacherDao { void teach();}//-------------------..原创 2021-01-06 15:24:55 · 268 阅读 · 3 评论 -
12.Flyweight——享元模式
demo描述:现有网站,不同的人登进去显示会有不同,如果每登一个用户就new一个用户和网站的话会使网站有很多相同的东西冗余,导致很耗内存。享元模式将共有的东西(内部状态)提出来存在享元对象内部共用,将变化的东西(外部状态)放到对象外边,内、外部状态结合起来用,解决重复对象内存耗费的问题。内部+外部状态=完整用户登录的网站demo代码:享元工厂,用于构建一个池容器,提供从池中获取对象的方法,。(工厂:new出来后做了别的操作,外界不用再new,拿来即用)public class WebSi.原创 2021-01-05 20:07:36 · 190 阅读 · 4 评论 -
11.Facade——外观模式
demo描述:现有投影仪、屏幕、DVD、爆米花,想要在家吃着爆米花看电影。如果单独调用它们的方法的话会让调用与每个类都产生关系导致调用混乱,就加了一层外观组装这些功能,通过调用外观达到调用只与外观这一个类产生关系的效果demo代码:四个提供功能支持的类,这里将它们做成了单例:public class DVDPlayer { private DVDPlayer() { } //单例-饿汉式 private static DVDPlayer instanc.原创 2021-01-05 16:42:55 · 190 阅读 · 2 评论 -
10.Decorator——装饰者模式
demo描述:一个咖啡店,有不同种类的咖啡,现要根据顾客买的咖啡,加的调料来计算要花的钱demo:印品抽象类:@Datapublic abstract class Drink { //价格 private float price = 0.0f; //描述 private String des; //计算价格 public abstract float cost();}主体,咖啡:public class Coffee ex.原创 2021-01-04 21:07:18 · 191 阅读 · 4 评论 -
9.Composite——组合模式
组合模式:创建了对象组的树形结构,表示整体-部分的层次关系,使用户对单个对象和组合对象的访问具有一致性。demo说明:用树形结构表示学校、学院、专业的层次关系demo代码:Component,用于访问管理其子部件:@Data@AllArgsConstructorpublic abstract class OrganizationComponent { //节点名字 private String name; //节点描述 private Str..原创 2021-01-04 14:25:19 · 226 阅读 · 3 评论 -
8.Bridge——桥接模式
桥接模式:抽象与现实分离,使各自可以独立变化demo描述:手机具有形状和品牌两个属性,要不用品牌的手机有不同的形状。如果采用继承方式实现,要么品牌继承形状导致品牌冗余、要么形状继承品牌导致形状冗余,用数学里的排列组合的方式来抽离出形状与品牌两个属性,让其组合,这样既能保证不冗余又能保证手机种类齐全。这里就是将属性形状、品牌搭建了个桥,做了个桥接模式。demo代码:品牌接口,定义手机应具备的功能;实现类,实现接口的功能:public interface Brand { v..原创 2021-01-04 09:46:32 · 216 阅读 · 5 评论 -
创建型模式总结
原创 2021-01-03 16:20:36 · 176 阅读 · 4 评论 -
7.Adapter——适配器模式
demo描述:要给手机充电,手机只能用5v的电压充电,提供的电影是220v的,为了给手机充上电,这时候需要一个适配器,让适配器转换电压,从而使手机能正常充电。适配器模式解决接口间的不兼容性,让原本不匹配的类可以协同工作,共3中实现方式:类适配器、对象适配器、接口适配器。demo:一、类适配器:目标(target),手机类:public class Voltage220V { public int output220V() { int src = 22...原创 2021-01-03 15:45:58 · 273 阅读 · 3 评论 -
6.Singleton——单例模式(8种)
单例模式:单例类只创建一个对象,类提供一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象。demo:饿汉式:静态常量方式:public class Singleton { //1.构造器私有化,外部不能new private Singleton(){} //2.本类内部创建对象实例 private final static Singleton instance=new Singleton(); //3.提供一个公有的静态方法,返回实例原创 2021-01-02 15:47:48 · 476 阅读 · 4 评论 -
5.Prototype——原型模式
原型模式:类提供一个克隆自己的方法,外界可以通过调用克隆的方法快速创建新的对象。好处:1.简化创建新对象的过程,提高效率2.不用重新初始化对象,而是动态的获得对象运行时的状态(如:创建对象过程中属性值发生变化,克隆出来的就是变化后的值)3.原型发生变化不用修改代码即可同步变化缺点:1.要为每个类配置克隆方法2.对已有类改造时要修改源码,违背开闭原则原型模式一,浅拷贝:demo:原型类:@Data@AllArgsConstructor@NoArgsCon.原创 2021-01-01 21:15:37 · 174 阅读 · 5 评论 -
4.Builder——建造者模式
demo描述:盖房子,根据需要可以盖普通房子,也可以盖高楼,无论盖什么样的房子,它们的流程类似。demo代码:抽象建造者,产品蓝图、规定建造产品的必要步骤,托管产品的实例化:public abstract class HouseBuilder { protected House house = new House(); //建造的必要步骤 public abstract void buildBasic(); public abstract void b.原创 2021-01-01 15:24:58 · 265 阅读 · 6 评论 -
3.AbsFactory——抽象工厂
demo还是上篇博文的demo,Pizza还是之前的Pizza,变化的代码如下:多了个工厂接口和两个工厂类:public interface AbsFactory { //让工厂子类去具体实现 Pizza createPizza(String orderType);}public class BJFactory implements AbsFactory { @Override public Pizza createPizza(String orderType原创 2020-12-28 20:29:57 · 240 阅读 · 1 评论 -
2.FactoryMethods——工厂方法
demo描述:Pizza为产品类,分为北京Pizza、伦敦Pizza,各地区下边又分为奶油Pizza、胡椒Pizza;OrderPizza为工厂,分为北京Pizza工厂、伦敦Pizza工厂。用工厂去创建Pizza产品,实现实例化与调用分离demo代码:产品类Pizza及其子类:public abstract class Pizza { protected String name; //准备原料,不同的披萨原料不同 public abstract void prepa原创 2020-12-28 17:25:23 · 209 阅读 · 4 评论 -
1.SimpleFactory——简单工厂
前言:***工厂:将类的实例化与调用分离,调用者只不用关心如何去实例化类,实例化成什么样的类对象,只需调用即可demo代码:Pizza(具体产品的抽象父类):抽象方法会在不同子类中有不同的实现,方便扩展public abstract class Pizza { protected String name; //准备原料,不同的披萨原料不同 public abstract void prepare(); public void bake() {原创 2020-12-28 15:13:13 · 216 阅读 · 4 评论 -
设计模式可以给我们带来什么
在做一件事时,先知道做这件事的意义,不至于做到中后期会感到迷茫,学习也是如此。~~~先问自己一个问题,为什么要学设计模式,它可以给我们带来什么?1.健壮而方便扩展:辛辛苦苦写完代码,正要小high一波,这时候人说你做的很好,但我还想要这样那样的东西时,当代码要大改时,什么心情,项目小还好,但项目大、代码多的时候,改吧,说不定动了哪导致一宿调不通,如何?设计模式可以有效节省这一宿的咖啡。2.可复用:类似的业务,类似的代码,重复的开发,这样的开发没意思,明明可以一次开发多次使用,偏偏机器搬的搬.原创 2020-12-27 15:26:57 · 351 阅读 · 3 评论