设计模式——代理模式
代理模式1、代理模式的基本介绍1)代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理对象访问目标对象,这样做的好处是可以在目标对象的基础上增强额外的功能操作,即扩展目标对象的功能。代理对象作为访问对象和目标对象之间的中介。
2)被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象。
3)代理模式有不同的形式,主要有三种,静态代理(静态代理类在编译期就生成,动态代理类则是在Java运行时动态生成)、动态代理(JDK代理、接口代理)和Cglib代理(可以在内存动态的创建对象,而不需要实现接口,他是是属于动态代理的范畴)。
4)代理模式示意图。
5)代理模式结构
代理(Proxy)模式分为三种角色
抽象主题(Subject)类:通过接口或抽象类声明真实主题和代理对象实现的业务方法。
真实主题(Real Subject)类:实现了抽象主题中的具体业务,是代理对象所代表的真实对象,是最终要引用的对象。
代理(Proxy)类:提供了与真实主题相同的接口,其内部含有对真实主题的引用,它可以访问、控制或扩展真实主题的功能。
2、静态代理基本介绍静态代理在使用时 ...
设计模式——享元模式
享元模式1、展示网站项目需求【1】需求小型外包项目,给客户A做一个产品展示网站,客户A的朋友感觉效果不错,也希望做这样的产品展示网站,但是要求都有些不同:
1)有客户要求以新闻的形式发布
2)有客户要求以博客形式发布
3)有客户希望以微信公众号的形式发布
【2】传统方式解决网站展现项目1)直接复制粘贴一份,然后根据客户不同要求,进行定制修改
2)给每个网站租用一个空间
【3】传统方案解决网站展现项目问题分析1)需要的网站结构相似度很高,而且都不是高访问量网站,如果分成多个虚拟空间来处理,相当于一个相同网站的实例对象很多,会造成服务器资源的浪费
2)解决思路:整合到一个网站中,共享其相关的代码和书籍,对于硬盘、内存、CPU、数据库空间等服务器资源都可以达成共享,减少服务器资源
3)对于代码来说,,由于是一份实例,维护和扩展都更容易
4)上面的解决思路就可以使用享元模式来解决
2、享元模式基本介绍1)享元模式(Flyweight Pattern)也叫蝇量模式:运用共享技术有效地支持大量细粒度的对象的复用。它通过共享已经存在的对象来大幅度减少需要创建的对象数量、避免大 ...
设计模式——外观模式
外观设计模式1、影院管理需求【1】需求组件一个家庭影院:
DVD播放器、投影仪、自动屏幕、环绕立体声、爆米花机,要求完成使用家庭影院的功能,其过程为:
直接用遥控器,统筹各设备开关
开爆米花机
放下屏幕
开投影仪
开音响
开DVD,选DVD
去拿爆米花
调暗灯光
播放
观影结束后,关闭各种设备
【2】传统方式解决影院管理需求存在的问题分析1)在ClientTest的main方法中,创建各个子系统的对象,并直接去调用子系统(对象)相关方法,会造成调用过程混乱,没有清晰的过程。
2)不利于在ClientTest中去维护对子系统的操作。
3)解决思路:定义一个高层接口,给子系统中的一组接口提供一个一致的界面(比如在高层接口提供四个方法ready、play、pause、end),用来访问子系统中的一群接口。
4)也就是说就是通过定义一个一致的接口(界面类),用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节=>外观模式
2、外观模式基本介绍1)外观模式(Facade),也叫“过程模式”:外观模式为子系统中的一组接口提供一个一致的 ...
设计模式——组合模式
组合设计模式1、学校院系展示需求【1】需求编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。
【2】方案1-传统方式解决学校院系展示存在的问题分析1)将学院看作是学校的子类,系是学院的子类,这样实际上是站在组织大小来进行分层次的
2)实际上我们的要求是:在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系,因此这种方案,不能很好的实现管理操作,比如对学院、系的添加,删除、遍历等
3)解决方案:把学校、院、系都看作是组织结构,它们之间没有继承关系,而是一个树形结构,可以更好的实现管理操作。=》组合模式
2、组合模式基本介绍1)组合模式(Composite Pattern),又叫部分整体模式,它创建了对象组的树形结构,将对象组合成树状结构以表示”整体-部分”的层次关系。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
2)组合模式依据树形结构来组合对象,用来表示部分以及整体层次。
3)这种类型的设计模式属于结构型模式。
4)组合模式使得用户对单个对象和组合对象的访问具有一致性,即 ...
设计模式——装饰者模式
装饰者设计模式1、星巴克咖啡订单项目(咖啡馆)【1】需求1)咖啡种类/单品咖啡:Espresso(意大利浓咖啡)、ShortBlack、LongBlack(美式咖啡)、Decaf(无因咖啡)
2)调料:Milk、Soy(豆浆)、Chocolate
3)要求在扩展新的咖啡种类时,具有良好的扩展性、改动方便、维护方便
4)使用OO的来计算不同种类咖啡的费用:客户可以点单品咖啡,也可以单品咖啡+调料组合。
【2】方案1-传统方式解决订单问题分析1)Drink是一个抽象类,表示饮料
2)des是对咖啡的描述,比如咖啡的名字
3)cost()方法就是计算费用,Drink类中做成一个抽象方法
4)Decaf就是单品咖啡,继承Drink,并实现cost
5)Espress&&Milk就是单品咖啡+调料,这个组合很多(组合起来就是一种咖啡,会有非常多组合,子类超级多)
6)问题:这样设计,会有很多类,当我们增加一个单品咖啡,或者一个新的调料,类的数量就会倍增,就会出现类爆炸
【3】方案2-解决星巴克咖啡订单(好一些)前面分析的方案1因为咖啡单品+调料组合会造成类的倍增, ...
设计模式——桥接模式
桥接设计模式1、手机操作问题现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网,打电话等)
【1】以上传统方式的缺点1)扩展性问题(类爆炸),如果我们再增加手机样式(旋转式),就需要增加各个品牌手机的类,同样如果我们增加一个手机品牌,也要再各个手机样式类下增加。
2)违反了单一职责原则,当我们增加手机样式时,要同时增加所有品牌的手机,这样增加了代码维护成本。
3)解决方案-使用桥接模式。
2、桥接模式的结构桥接(Bridge)模式包含了以下主要角色:
抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过组合关系调用实现化角色中的业务方法。
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
3、桥接模式——基本介绍1)桥接模式(Bridge模式)是指:将实现与抽象放在两个不同的类层次中,使两个层 ...
设计模式——适配器模式
0、结构型模式结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者采用组合或聚合来组合对象。
由于组合关系或聚合关系比继承关系耦合度低,满足”合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。
结构型模式分为以下7种:
代理模式
适配器模式
装饰者模式
桥接模式
外观模式
组合模式
享元模式
适配器设计模式1、旅游使用插座问题不同国家所使用的插座国标是不同的,所以去国外旅游可以买个多功能转换插头(适配器),这样就可以使用了。
2、适配器模式——基本介绍1)适配器模式(Adapter Pattern)将某个类的接口转换成客户端期望的另一个接口表示,主要目的是为了保证兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。
2)适配器模式属于结构型模式。
3)主要分为三类:类适配器模式、对象适配器模式、接口适配器模式。类适配器模式比对象适配器模式的耦合度高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。
3、适配器 ...
设计模式——建造者设计模式
建造者设计模式1、盖房子项目需求1)需要建房子:这一过程为打桩、砌墙、封顶。
2)房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的。
3)编写程序,完成需求。
12345678910111213141516171819202122232425262728293031323334// 传统解决方式public abstract class AbstractHouse { // 打地基 public abstract void buildBasic(); // 砌墙 public abstract void buildWalls(); // 封顶 public abstract void roofed(); public void build() { buildBasic(); buildWalls(); roofed(); }}public class HighBuilding extends Abs ...
设计模式——原型设计模式
原型设计模式1、克隆羊问题现在有一只羊,姓名为:tom,年龄为:1,颜色为:白色,请编写程序创建和tom杨属性完全相同的10只羊。
12345678910111213141516171819202122232425262728293031// 传统解决方式public class Sheep { private String name; private Integer age; private String color; public Sheep() {} public Sheep(String name, Integer age, String color) { this.name = name; this.age = age; this.color = color; } getter()... setter()...}public class Test { public static void main ...
设计模式——工厂设计模式
工厂设计模式1、一个具体需求一个披萨的项目:要便于披萨种类的扩展,要便于维护。
1)披萨的种类很多(比如GreekPizz、CheesePizz等)
2)披萨的制作有prepare,bake,cut,box
3)完成披萨店订购功能。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980// 将Pizza类做成抽象类public abstract class Pizza { protected String name; // 准备原材料,不同pizza是不一样的 public abstract void prepare(); public void bake() { System.out.println(name + "baking;"); } ...