常见设计模式

设计模式
设计模式(Design Patterns),是指在软件设计中,被反复使用的一种代码设计经验。使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性。

类型
总共有23种设计模式,可以分为3大类:
创建型模式:关注的点是如何创建对象,将对象的创建和使用相分离,使得这两者相对独立
工厂方法 抽象工厂 建造者 原型 单例
结构型模式:通过组合各种对象来获取更好的结构,虽然面向对象的继承机制提供了最基本的子类扩展父类的功能,但结构型模式不仅仅简单地使用继承,而更多地通过组合与运行期的动态组合来实现更灵活的功能
适配器 桥接 组合 装饰器 外观 享元 代理
行为型模式:主要涉及算法和对象间的职责分配。通过使用对象组合,行为型模式可以描述一组对象应该如何协作来完成一个整体任务。
责任链 命令 解释器 迭代器 中介 备忘录 观察者 状态 策略 模板方法 访问者

基本原则
1.开闭原则:对扩展开放,对修改关闭,为了使程序的扩展性好,易于维护和升级
2.合成复用原则:尽量使用合成/聚合的方式,而不是使用继承
3.迪米特法则(最少知道原则):一个实体应少于其他实体发生作用,相对独立
4.接口隔离原则:使用多个隔离的接口,比使用单个接口要好
5.依赖倒转原则:针对接口编程,依赖于抽象而不依赖于具体
6.里氏代换原则:继承和派生的规则
7.单一职责原则:一个类负责一项职责

建造者模式
建造者模式使用多个简单的对象一步一步构建成一个复杂的对象,属于创建型模式,提供了最佳创建对象的方式
使用场景:肯德基中的套餐,基础的汉堡,饮品不变,搭配多样化产生不同的套餐
优点:建造者独立,易扩展,便于控制风险
缺点:产品要有共同点,范围受限

实现:我们假设有快餐店的案例,一个典型的套餐是汉堡(Burger)和一杯冷饮(Cold drink),汉堡分为素食汉堡和鸡肉汉堡,包在纸盒中,冷饮是可口和百事可乐,在瓶子中我们将创建一个表示食物详情Item接口和食物包装Packing接口,然后创建一个Meal类带有Item的ArrayList,以及一个通过结合Item来创建不同类型的Meal对象的MealBuilde,最后的Demo就是用MealBuilder来创建一个Meal

工厂模式
在工厂模式中,我们创建对象时不会对客户端暴露创建逻辑,并且通过使用一个共同的接口来指向新创建的对象
使用场景:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类才进行,比如设计一个连接服务器的框架,需要多个协议"POP3",“IMAP”,“HTTP”,可以把这三个作为产品类,共同实现一个接口
优点:
1.一个调用者想创建一个对象,只需要知道名称就可以了
2.扩展性高,增加一个产品,只需扩展一个工厂类即可
3.屏蔽掉产品的具体实现,调用者只关心产品的接口
缺点:每次增加一个产品,都需要增加一个具体类和对象实现工厂,使得类的个数成倍增加增加了系统的复杂度

实现:我们将创建一个Shape接口和实现Shape接口的实体类,接下来就是定义工厂类ShapeFactory,而Demo是通过ShapeFactory来获取Shape对象,通过相ShapeFactory传递想创建的对象类型,来获取所需对象

单例模式
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建,这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要直接实例化该类的对象
使用场景:保证一个类只有一个实例,对外提供一个访问它的全局访问点
注意:
1.单例类只能有一个实例
2.单例类必须自己创建自己的唯一实例
3.单例类必须给所有对象提供这一实例

优点:
1.在内存中只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例
2.避免对资源的多重占用
缺点:没有接口,不能继承
实现:我们将创建一个SingleObject类,它有他自己的私有构造函数和本身的静态实例,也提供了一个静态方法来供外界获取到它的静态实例,SingletonPatternDemo类使用SingleObject类来获取对象

适配器模式
适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁,属于结构型模式,结合了两个接口之间的功能,比如读卡器就是作为内存卡和电脑之间的适配器
使用场景:将一个类的接口转换成客户需要的另一个接口
优点:可以让任何两个没有关联的类一起运行,提高类的复用,灵活性高
缺点:过多使用适配器会导致系统特别乱,不易对外理解
实现:我们创建两个接口,MediaPlayer(内置类型mp3),AdvancedMediaPlayer(需要适配的类型mp4,vlc),实现AdvancedMediaPlayer实体类和MediaPlayer的实体类AudioPlayer,适配器用MediaAdapter进行适配,并使用AdvancedMediaPlayer对象来播放所需的格式

观察者模式
属于行为型模式,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新
使用场景:拍卖东西的时候,拍卖师将观察当前最高标价,然后通知给其他竞价者
优点:观察者和被观察者是抽象耦合的,建立一套触发机制
缺点:如果一个被观察者对象有很多的观察者的话,通知到所有的观察者会花费一些时间,观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而是只知道发生变化
实现:我们创建Subject类,Observer抽象类和抽象类Observer的实体类,ObserverPatternDemo演示使用Subject和实体类对象

策略模式
在策略模式中,一个类的行为可以在运行时更改,这种类型的设计模式属于行为型模式
应用场景:上班的出行方式,可以骑车,开车,地铁,公交等每一种出行方式都是一个策略
优点:1.避免使用多重判断2.扩展性好
缺点:1.策略类会增多2.所有策略类对外暴露
实现:我们创建定义活动的Strategy接口和实现了Strategy接口的实体类,Context是一个使用策略的类,Demo演示类使用Context和策略对象来演示Context在它所配置或使用的策略改变时的行为变化

责任链模式
责任链模式为请求创建了一个接收者对象的链,这种模式给予请求的类型,对请求的发送者和接收者进行解耦,属于行为型模式
应用场景:责任链上的处理者负责处理请求,客户只需要将请求发送到责任链上,无须关心请求的处理细节和请求的传递,所以责任链将请求的发送者和请求的处理者解耦了
优点:降低耦合度,增加新的处理类方便
缺点:不能保证请求一定能接收
实现:我们创建抽象类AbstractLogger,带有详细的日志记录级别,扩展AbstractLogger创建三种类型的记录器,每个记录器消息的级别是否属于自己的级别,是就打印,不是就交给下一个记录器

模版模式
在模版模式中,一个抽象类公开定义了执行他的方法的模版,他的子类可以按需要重写方法实现,但调用将以抽象类中定义的方法进行,属于行为型模式
应用场景:解决一些方法通用,却在每一个子类都重写了这一方法的这种情况
优点:
1.封装不变部分,扩展可变部分
2.行为由父类控制,实现由子类负责
缺点:导致类的个数增多
实现:我们创建一个抽象类Game以及抽象的方法和一个用final修饰的方法(不能被重写)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值