简单理解-设计模式

一,设计模式的六大原则

1.单一职责原则

一个类只负责一个功能领域的相应职责,一个类,应该只有一个引起它变化的原因

2.开闭原则

软件实体对扩展开发,对修改关闭。即软件实体应该尽量在不修改原有代码的情况下进行扩展,抽象化是开闭原则的关键

3.里氏替换原则

只要父类出现的地方子类一定可以出现,而且替换为子类也不会出现异常和报错,使用者不需要知道是父类还是子类,但是子类出现的地方,不一定能使用父类,应该尽量避免子类的“个性”。(面向对象设计的基本原则)

4.依赖倒置原则

抽象依赖细节,细节不依赖抽象,高层模块不应该依赖底层模块,两者都应该依赖其抽象(抽象指的是接口和抽象类,不能被直接实例化,细节指的是实现类,实现接口或者继承抽象类产生的类就是细节,可以被实例化)

5.接口隔离原则

客户端不应该依赖它不需要的接口,接口应该为单一接口,接口尽量细化,接口中的方法尽可能少,接口要求高内聚,提高接口,类,模块的处理能力,减少对外的交互。使用多个隔离的接口,比使用单个接口好

6.迪米特原则

一个对象应该对其它对象有最少的了解,降低模块之间的耦合(又叫最少知识原则)
https://www.cnblogs.com/kafeibuku/p/5671394.html

二,模式的具体方式

1.工厂模式

①简单工厂:简单工厂把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个具体子类来实例化。缺点:违反了高内聚原则
比如鼠标工厂:给参数1,生产苹果鼠标,给参数2,生产戴尔鼠标。如果传入工厂类中没有的参数,就生产不了产品
②工厂模式:创建多个工厂类,各个工厂类中,都对应一个获得接口实例的方法。不同的任务交给不用的工厂,比简单工厂多了一级,要生产戴尔鼠标,就交给戴尔工厂
③抽象工厂:用于生产产品为多个时,提供一个创建一系列相关产品的类,生产鼠标加键盘,继承这个类,就可以生产鼠标加键盘
应用:更换皮肤,一整套相关皮肤一起换
缺点:扩展困难,新增一个产品时,要更新生产类
http://www.runoob.com/design-pattern/abstract-factory-pattern.html

2.单例模式

一个类只有一个实例,并提供该实例的全局访问点
解决:一个全局使用的类被频繁的创建和销毁
实现:使用一个私有构造函数,一个私有静态变量和一个公有静态函数实现
私有构造函数:保证不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量
懒汉式:真正用的时候才创建这个单例对象,适用于单例不经常被使用
饿汉式:不管是否用得上,一开始就创建这个单例对象,适用于单例经常被使用
①懒汉,线程不安全:不支持多线程,没有加锁,多个线程能够同时进入

 if (uniqueInstance == null),那么就会多个线程同时去实例化单例
public class Singleton {
    private static Singleton uniqueInstance;
    private Singleton() {
    }
    public static Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }
}

②懒汉,线程安全:对获取唯一实例方法getUniqueInstance()加锁,其它进程会等待,线程阻塞时间长,有性能问题,不推荐

public static synchronized Singleton getUniqueInstance() {
    if (uniqueInstance == null) {
        uniqueInstance = new Singleton();
    }
    return uniqueInstance;
}

③饿汉模式:多线程安全,类加载时就初始化,浪费内存,容易产生垃圾对象,优点是没有锁,执行效率很高

public class Singleton {  
    private static Singleton instance = new Singleton();  
    private Singleton (){}  
    public static Singleton getInstance() {  
    return instance;  
    }  
}

④双重校验锁:先判断 uniqueInstance 是否已经被实例化,如果没有被实例化,那么才对实例化语句进行加锁

3.建造者模式(生成器模式)

使用多个简单对象一步一步构建成一个复杂对象,饭店点餐,可以单点,可以点套餐,需要最后点一下确定来完成订单

4.原型模式

通过复制来创建新对象,用于当创建一个新对象成本很大时,通过clone()实现

5.适配器模式

将一个类接口转换成另一个用户需要的接口,相当于一个转换器

6.桥接模式

实现抽象和实现的分离,使他们都可以独立的变化,比如电子开关,开关是抽象的,不用管里面具体是怎么实现

7.组合模式

将对象组合成树形结构来表示“整体/部分/层次”关系,允许用户以相同的方式处理单独的对象和组合对象,即对象包含对象

8.装饰器模式

允许向一个现有的对象添加新的功能,同时不改变其结构,创建装饰类,用于包装原有的类,一般该模式用于动态添加额外功能,比如开通会员,就多了一个功能

9.外观模式

隐藏系统复杂性,并向客服端提供一个客服端可以访问系统的接口,降低防问复杂系统的复杂度,简化客服端和系统的接口,比如看病时的接待人员,缺点是改东西很麻烦,看电影需要很多电器,外观模式一键看电影

10.享元模式

利用共享的方式来支持大量细粒度的对象,这些对象一部分内部状态是相同的,减少对象数量,减低系统的内存,享元对象共享内部状态,比如数据库的连接池,适用于系统内有大量相似对象

11.代理模式

为其它对象提供一种代理用来控制对这个对象的访问,比如增加中间层,防火墙代理,用于远程连接的远程代理,虚拟代理

12.责任链模式

使多个对象都有机会处理处理请求,从而避免请求的发送者和接收者之间耦合,将这些对象连成一条链,并沿着这条链发送该请求,知道一个对象处理它为止
责任链上的处理中负责处理请求,客户只需要将请求发送到链上,无需关心请求的处理细节和请求的传递,从而达到发送者和处理中解耦,缺点是无法保障每个请求被接收,不容易直观得观察到运行结果,对于排错有一定影响

13.命令模式

请求以命令的形式包裹在对象中,并传给调用对象,调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
解决命令的请求者和命令的实现者之间的耦合关系,更方便的对命令进行扩展,多国歌命令进行统一控制,认为是命令的地方就可以使用命令模式,模拟cmd

14.解析器模式

提供一个表达式接口,该接口解析一个特定的上下文,常见为sql解析,符号处理引擎,编译器,运算表达式计算

15.迭代器模式

用于顺序访问集合对象的元素,无需暴露该对象的内部实现,把元素游走的责任交给迭代器,而不是聚合对象

15.中介者模式

提供一个中介类,处理不同类之间的通信,支持松耦合,使代码易于维护,MVC框架种的Controller,就是一个中介类,机场调度系统。降低类的复杂度,将一对多转换成一对一,对各个类进行了解耦

16.备忘录模式

保存一个对象的某个状态,以便在适当的时候恢复对象。在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。常见游戏存档,数据库的事务管理,提供一个可回滚的操作

17.观察者模式

对象存在一对多关系,用于一个对象被修改时,自动通知它的依赖对象。观察者和被观察者是抽象耦合的。电子眼观察违章行为,有的话,就通知相关部门

18.状态模式

允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它所属的类
用于当一个状态的行为取决于它的状态的时候,即状态决定行为
销售机有多种销售状态,每种状态下有不同的行为,状态可以发生转移,使销售机的行为也发生改变,“遇强则强”,适用于行为随状态改变场景,switch-case模式的替代者

19.策略模式

一个类的行为或者其算法可以在运行时改变。定义一系列算法,封装每个算法,并使他们可以互换,所有的策略类都需要向外暴露
超市的打折策略:满1000打9折,满500打9.5折
和状态模式相比:都是动态改变对象的行为,但是状态模式是状态转移过程中发生相应变化,注意必须是要在运行过程中,状态模式主要是用来解决状态转移的问题,策略模式主要用来封装一组可以互相替换的算法族,并且可以根据需要动态替换。状态模式封装的是对象的内在状态变化,策略模式封装的是一系列平行且复杂的多变的实现方式

20.模板模式

定义操作中算法的骨架,适用于系统中存在一些的通用方法,将他们做成模板
通过模板方法,子类可以重新定义算法的某些步骤,而不用改变算法的机构
封装不变部分,扩展可变部分,提取公共代码,便于维护,防止恶意操作,一般模板方法都加finan关键字

20.访问者模式

(最复杂的一个设计模式)
为一个对象结构增加新功能,使用一个访问者类,改变元素类的执行算法,通过这种方式,元素的执行算法可以随着访问者改变而改变
将数据结构和数据操作分离。封装一个作用于某种数据结构中的个元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作
有一个操作作用于一些元素之上,这些元素属于某一个对象结构,同时这个操作是在不改变各元素的类的前提下。
违反了迪米特和依赖倒置原则

21.空对象模式

使用什么都不做的空对象来代替Null,用一个空对象取代Null对象实例的检查,Null对象不是检查空值,反应一个不做任何动作的关系。这样的Null对象可以在数据不可用的时候提供默认的行为

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值