薇薇
爱好网络技术
展开
-
设计模式-设计模式的三个分类及汇总
一、什么是设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多...原创 2021-01-22 11:16:00 · 289 阅读 · 0 评论 -
JAVA设计模式--七大原则之单一职责(01)
一个类,只有一个引起它变化的原因。应该只有一个职责。每一个职责都是变化的一个轴线,如果一个类有一个以上的职责,这些职责就耦合在了一起。这会导致脆弱的设计。当一个职责发生变化时,可能会影响其它的职责。另外,多个职责耦合在一起,会影响复用性。例如:要实现逻辑和界面的分离。简单通俗的来说:一个类只负责一项职责。问题:比如一个类T负责两个不同的职责:职责P1,职责P2。当由于职责P1需求发生改变而需要修改类T时,有可能会导致原本运行正常的职责P2功能发生故障。解决方法:遵循单一职责原则。不遵守职原创 2021-01-14 15:36:18 · 129 阅读 · 0 评论 -
JAVA设计模式--七大原则之接口隔离原则(02)
通俗来讲,接口隔离原则什么意思?原定义:客户端不应该依赖它不需要的接口;一个类对另一个类的依赖应该建立在最小的接口上。其原则字面的意思是:使用多个隔离的接口,比使用单个接口要好。本意降低类之间的耦合度,而设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。问题由来:类A通过接口I依赖类B,类C通过接口I依赖类D,如果接口I对于类A和类B来说不是最小接口,则类B和类D必须去实现他们不需要的方法。解决方案:将臃肿的接口I拆分为独立的几.原创 2021-01-14 16:20:52 · 103 阅读 · 0 评论 -
JAVA设计模式--七大原则之依赖倒置原则(03)
依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体。面向抽象编程,不要依赖具体因为依赖了具体就不能进行改变和动态的替换;(这里所说的动态替换是替换具体的实现,而不是在使用时,替换默认的具体)实现开闭原则的关键是抽象化,并且从抽象化导出具体化实现,如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要手段。定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。通俗点说:原创 2021-01-14 16:33:34 · 97 阅读 · 0 评论 -
JAVA设计模式--七大原则之里氏替换原则(04)
里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。看完上面的概念估原创 2021-01-14 16:49:21 · 112 阅读 · 0 评论 -
JAVA设计模式--七大原则之开闭原则(05)
开闭原则就是说对扩展开放,对修改关闭。扩展开放---对提供方(新增加的功能)修改关闭--使用放public class Simple01 { public static void main(String[] args) { CarFactory carFactory = new CarFactory(); carFactory.getCar(new SuvCar(30)); carFactory.getCar(new JcCar(7原创 2021-01-14 17:31:14 · 102 阅读 · 0 评论 -
JAVA设计模式--七大原则之迪米特法则(最少知道原则)(06)
为什么叫最少知道原则就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。也就是说一个软件实体应当尽可能少的与其他实体发生相互作用。这样,当一个模块修改时,就会尽量少的影响其他的模块,扩展会相对容易,这是对软件实体之间通信的限制,它要求限制软件实体之间通信的宽度和深度。定义:一个对象应该对其他对象保持最少的了解。问题由来:类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。解决方案:尽量降低类与类之间的耦合。自从我们接触编程原创 2021-01-14 17:47:34 · 334 阅读 · 0 评论 -
JAVA设计模式--七大原则之合成复用原则(07)
能够使用合成/聚合的方式处理问题的,就尽量不要使用继承原创 2021-01-14 17:49:20 · 117 阅读 · 0 评论 -
设计模式-创建型01-单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。介绍意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。原创 2021-01-15 13:43:39 · 78 阅读 · 0 评论 -
设计模式-创建型02-工厂模式-工厂方法模式01
工厂方法模式分为三种:普通工厂模式 多个工厂方法模式 1、普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。首先看下关系图:举例如下:(我们举一个发送邮件和短信的例子)首先,创建二者的共同接口:public interface Sender { public void Send();}其次,创建实现类:public class MailSender implements Sender { @Override public void Se.原创 2021-01-15 14:33:38 · 78 阅读 · 0 评论 -
设计模式-创建型02-工厂模式-抽象工厂模式02
工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题,如何解决?就用到抽象工厂模式,创建多个工厂类,这样一旦需要增加新的功能,直接增加新的工厂类就可以了,不需要修改之前的代码。因为抽象工厂不太好理解,我们先看看图,然后就和代码,就比较容易理解。请看例子:public interface Sender { public void Send();}两个实现类:public class M原创 2021-01-15 14:51:33 · 94 阅读 · 0 评论 -
设计模式-创建型03-建造者模式(builder)
工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性,其实建造者模式就是前面抽象工厂模式和最后的Test结合起来得到的。我们看一下代码:还和前面一样,一个Sender接口,两个实现类MailSender和SmsSender。最后,建造者类如下:public class Builder { private List<Sender> list = new ArrayList<Sender&g原创 2021-01-13 10:59:19 · 106 阅读 · 0 评论 -
设计模式-创建型04-原型模式
原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制、克隆,产生一个和原对象类似的新对象。本小结会通过对象的复制,进行讲解。在Java中,复制对象是通过clone()实现的,先创建一个原型类:public class Prototype implements Cloneable { public Object clone() throws CloneNotSupportedException { Prototype proto原创 2021-01-15 15:41:10 · 97 阅读 · 2 评论 -
设计模式-结构性02-装饰模式(Decorator Pattern)
顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口。装饰对象持有被装饰对象的实例,关系图如下:Source类是被装饰类,Decorator类是一个装饰类,可以为Source类动态的添加一些功能,代码如下:public interface Sourceable { public void method();}public class Source implements Sourceable { @Override public原创 2021-01-19 17:26:38 · 93 阅读 · 0 评论 -
设计模式-结构性03-代理者模式(Proxy)
代理(Proxy)模式:为某对象提供一种代理以 控制对该对象的访问。即客户端通过代理间接地访问该对象,从而限制、增强或修改该对象的一些特性。比如我们在租房子的时候会去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做,此处的代理就是这个意思。再如我们有的时候打官司,我们需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们的想法。 代理模式是隐藏被代理对象的复杂实现(直接持有被代理对象的实例),偏向于委托类的访问限制(比如你去找...原创 2021-01-13 16:45:36 · 83 阅读 · 0 评论 -
设计模式-结构性04-外观/门面模式(Facade)
外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口,看下类图:(我们以一个计算机的启动过程为例)我们先看下实现类:public class CPU { public void startup(){ System.out.println("cpu startup!"); } public void shutdown(){ S原创 2021-01-20 10:06:48 · 83 阅读 · 0 评论 -
设计模式-结构性05-桥接模式(Bridge Pattern)
桥接模式就是把事物和其具体实现分开,使他们可以各自独立的变化。桥接的用意是:将抽象化与实现化解耦,使得二者可以独立变化,它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。像我们常用的JDBC桥DriverManager一样,JDBC进行连接数据库的时候,在各个数据库之间进行切换,基本不需要动太多的代码,甚至丝毫不用动,原因就是JDBC提供统一接口,每个数据库提供各自的实现,用一个叫做数据库驱动的程序来桥接就行了。我们来看看关系图:实现代码:先定义接口:pub原创 2021-01-19 14:41:44 · 100 阅读 · 0 评论 -
设计模式-结构性06-组合模式(Composite)
组合模式有时又叫部分-整体模式在处理类似树形结构的问题时比较方便,看看关系图:直接来看代码:public class TreeNode { //节点名称 private String name; //父节点(引用) private TreeNode parent; //子节点(结合) private Vector<TreeNode> children = new Vector<TreeNode>(); public TreeNode(St.原创 2021-01-20 09:16:48 · 64 阅读 · 0 评论 -
设计模式-结构性07-享元模式(Flyweight)
享元模式的主要目的是实现对象的共享,即共享池,当系统中对象多的时候可以减少内存的开销,通常与工厂模式一起使用。FlyWeightFactory负责创建和管理享元单元,当一个客户端请求时,工厂需要检查当前对象池中是否有符合条件的对象,如果有,就返回已经存在的对象,如果没有,则创建一个新对象,FlyWeight是超类。一提到共享池,我们很容易联想到Java里面的JDBC连接池,想想每个连接的特点,我们不难总结出:适用于作共享的一些个对象,他们有一些共有的属性,就拿数据库连接池来说,url、driverC原创 2021-01-20 16:28:20 · 71 阅读 · 0 评论 -
设计模式-结构性01-适配器模式(Adapter Pattern)
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:(1)类的适配器模式(2)对象的适配器模式(3)接口的适配器模式首先,我们来看看类的适配器模式,先看类图:【当希望将一个类转换成满足另一个新接口的类时,可以使用类的适配器模式,创建一个新类,继承原有的类,实现新的接口即可】核心思想就是:有一个Source类,拥有一个方法,待适配,目标接口时Targetable,通过Adapter类,将Source的功能扩..原创 2021-01-15 17:12:00 · 91 阅读 · 0 评论 -
设计模式-行为型01-策略模式(strategy)
策略(Strategy)模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数,关系图如下:图中ICalculator提供统一的方法,AbstractCalculator是辅助类,提供辅助方法,接下来,依次实现下每个类:首先统一接口:public interface ICalculator { public i...原创 2021-01-21 17:28:34 · 69 阅读 · 0 评论 -
设计模式-行为型02-模板方法模式(Template Method)
模板方法(TemplateMethod)模式:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。即:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,先看个关系图:就是在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus分别.原创 2021-01-21 08:59:54 · 75 阅读 · 0 评论 -
设计模式-行为型03-观察者模式(Observer)
观察者(Observer)模式:多个对象间存在一对多关系,当一个对象发生改变时,会把这种改变通知给其他多个对象,从而影响其他对象的行为。先来看看关系图:我解释下这些类的作用:MySubject类就是我们的主对象,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类中定义着需要监控的对象列表,可以对其进行修改:增加或删除被监控对象,且当MySubject变化时,负责通原创 2021-01-21 14:38:56 · 84 阅读 · 4 评论 -
设计模式-行为型04-迭代子模式(Iterator)
迭代器(Iterator)模式:提供一种方法来顺序访问聚合对象中的一系列数据,而不暴露聚合对象的内部表示。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。我们看下关系图:这个思路和我们常用的一模一样,MyCollection中定义了集合的一些操作,MyIterator中定义了一系列迭代操作,且持有Collection实例,我们来看看实现代码:两个接口://集合操作public interface Collection { //原创 2021-01-21 14:21:06 · 78 阅读 · 0 评论 -
设计模式-行为型05-责任链模式(Chain of Responsibility)
职责链(Chain of Responsibility)模式:把请求从链中的一个对象传到下一个对象,直到请求被响应为止。通过这种方式去除对象之间的耦合。发出者并不清楚到底最终那个对象会处理该请求,所以,责任链模式可以实现,在隐瞒客户端的情况下,对系统进行动态的调整。先看看关系图:Abstracthandler类提供了get和set方法,方便MyHandle类设置和修改引用对象,MyHandle类是核心,实例化后生成一系列相互持有的对象,构成一条链。public interface Hand原创 2021-01-22 11:43:39 · 85 阅读 · 0 评论 -
设计模式-行为型06-命令模式(Command)
命令(Command)模式:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行。这个过程好在,三者相互解耦,任何一方都不用去依赖其他人,只需要做好自己的事儿就行,司令员要的是结果,不会去关注到底士兵是怎么实现的。我们看看关系图:Invoker是调用者(司令员)Receiver是被调用者(士兵)MyCommand是命令.原创 2021-01-21 10:43:42 · 74 阅读 · 0 评论 -
设计模式-行为型07-备忘录模式(Memento)
备忘录(Memento)模式:在不破坏封装性的前提下,获取并保存一个对象的内部状态,以便以后恢复它。Original类是原始类,里面有需要保存的属性value及创建一个备忘录类,用来保存value值。Memento类是备忘录类(拥有与原始类相同的属性--主要是保存属性用),Storage类是存储备忘录的类,持有Memento类的实例,该模式很好理解。直接看源码//原始类public class Original { private String value; publ原创 2021-01-22 10:24:23 · 79 阅读 · 0 评论 -
设计模式-行为型08-状态模式(State)
状态(State)模式:允许一个对象在其内部状态发生改变时改变其行为能力(需要有状态类来持有状态)。比如QQ来说,有几种状态,在线、隐身、忙碌等,每个状态对应不同的操作,而且你的好友也能看到你的状态,所以,状态模式就两点:1、可以通过改变状态来获得不同的行为。2、你的好友能同时看到你的变化。看图:State类是个状态类,Context类可以实现切换,我们来看看代码:/** * 状态类的核心类 */public class State { private .原创 2021-01-22 11:14:12 · 61 阅读 · 0 评论 -
设计模式-行为型09-访问者模式(Visitor)
访问者(Visitor)模式:在不改变集合元素的前提下,为一个集合中的每个元素提供多种访问方式,即每个元素有多个访问者对象访问。访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化。访问者模式适用于数据结构相对稳定算法又易变化的系统。因为访问者模式使得算法操作增加变得容易。若系统数据结构对象易于变化,经常有新的数据对象增加进来,则不适合使用访问者模式。访问者模式的优点是增加操作很容易,因为增加操作意味着增加新的访问者。访问者模式将有关行为集中到一个访问者对象中,其改变原创 2021-01-21 13:21:24 · 79 阅读 · 0 评论 -
设计模式-行为型10-中介者模式(Mediator)
中介者(Mediator)模式:定义一个中介对象来简化原有(多个对象与多个对象)对象之间的交互关系,降低系统中对象间的耦合度,使原有对象之间不必相互了解。中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改。如果使用中介者模式,只需关心和Mediator类的关系,具体类类之间的关系及调度交给Mediator就行,这有点像spring容器的作用。先看看图:User类统一接口,User1和Use.原创 2021-01-22 10:23:11 · 85 阅读 · 0 评论 -
设计模式-行为型11-解释器模式(Interpreter)
解释器(Interpreter)模式:提供如何定义语言的文法,以及对语言句子的解释方法,即解释器。一般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄。Context类是一个上下文环境类,Plus和Minus分别是用来计算的实现,代码如下:public interface Expression { public int interpret(Context context);}public class Plus implements Expression { @Over原创 2021-01-22 11:05:39 · 76 阅读 · 0 评论