常用设计模式

设计模式
1.1设计模式简介
设计模式:每一个模式都描述了在我们的环境中不断出现的问题的解决方案的核心。通过这种方式,可以无数次地使用那些已有的解决方案,无需做重复相同的工作。
模式的组成:特点的环境+产生的一个问题+解决方案
模式的核心思想:进行设计的复用

1.2设计模式与体系结构模式:
设计模式:描述了定制化的相互通信的对象与类,已解决特定环境中的通用设计问题。
体系结构模式:是对系统的高层设计,是从一个较高的层次来考虑组成系统的构件,构件之间的连接关系,以及系统需要满足的约束,用以实现体系结构级的设计复用。通常被称为架构模式,体系结构风格。
二者关系:多个设计模式组件相组合形成了体系结构模式
1.3设计原则
1单一职责原则:类的职责要单一,高内聚,低耦合
2开闭原则:对实体拓展开放,对修改关闭
3里氏代换原则:在软件系统中,可以接受基类对象的地方,必然能使用子类对象
4依赖倒转原则:针对抽象层编程而不是具体的类
5合成复用原则:系统中尽量多的使用组合和聚合关联关系,尽量少使用甚至不使用继承关系。
6接口隔离原则:使用多个接口而不是一个统一的接口
7迪米特法则:两个类之间不应当发生直接的相互作用,相互通信,而是通过引入一个第三者发生间接交互。

2.1 单例模式
确保一个类仅有一个唯一的实例,并且提供一个全局的访问接口。
应用场景:全局有且只有一个实例产生,比如,任务管理器,无论怎么打开有且只有一个。
解决的问题:只有一个唯一的实例(独生子女)

解决方案:
首先将构造函数声明为私有类型,屏蔽通过直接实例化的形式来访问
其次控制全局只有一个实例的类------Static
第三,提供一个可以获得实例的方法,用于返回类的实例,并保证得到的是同一个对象

3.1观察者模式:发布-订阅模式

两个角色:观察者和被观察对象。当被观察者发生改变时,观察者就会收到来自被观察者的消息变化,做出响应。
比较直观的一种形式是使用“注册----通知----撤销注册”

实现步骤:观察者将自己注册到被观察者对象的容器中,被观察对象发生了某种变化,从容器中得到所有的注册对象,逐一通知变化,撤销的时候,观察者通知被观察者,将观察者从容器中清除
减少观察者和被观察者对象之间的耦合

观察者实现类

简单使用加测试结果

4.1适配器模式
使用环境:同一种东西,在不同的环境展现方式不同
例如:游戏中的坐骑-----五彩神鹿,在第一世界它的行走方式是喷跑,在第二世界,行走方式为飞

问题:想使用一个已经存在的类,但他的接口不符合需求
适配器模式:将一个类的接口转换为客户希望的另外一个接口,是的原本接口不兼容而不能一起工作哦的那类类可以一起工作。
适配器模式有四个角色:
目标(target):定义客户端使用的与特定领域相关的接口
被适配者(adaptee)定义了一个已经存在的接口,这个接口需要匹配
适配者(adapter):对Adaptee的接口与target的接口进行适配
客户端(Client):与符合target接口的对象协同。

4.2适配器模式分类
4.2.1类的适配器模式(采用继承实现)
实现步骤(确定目标接口,确定被适配者,创建适配器,继承自被试配者,实现目标接口)
4.2.2对象适配器(采用对象组合方式实现)
实现步骤(确定目标接口,确定被试配者,创建适配器:拥有被试配者的对象,实现目标接口)
1.被确定目标接口

2.确定被试配者:

3.创建适配器(类适配器)将飞的方式给被适配者

/类适配器/
public class ClassAdapter extends Deer implements ITarget {
@Override
public void fly() {
System.out.println(“进入第二世界,我可以带你飞哦”);
}
}

3.2对象适配器
public class ObjectAdapter implements ITarget {
private Deer deer;
public ObjectAdapter(Deer d){
this.deer=d;
}
@Override
public void run() {
deer.run();
}
@Override
public void fly() {
System.out.println(“起飞”);
}
}
使用:

二者比较:
类适配器采用多继承的实现方式,带来了不良的高耦合
对象适配器采用对象组合的方式,更符合松耦合精神
类适配器无法面对多个被适配对象

5.1策略模式
环境:游戏中,游戏人物可以有多种组合的武器,比如AK47+98K
或者m416+m24,在团队竞技可以随意切换组合,或者在打人的时候可以随意在两种武器之间进行切换。
策略模式:让算法独立于使用它的客户而独立变化。并将每一个算法封装起来,使他们可以相互替换。

三个角色:
抽象策略类:定义所有支持的算法的公告接口
具体策略类:以抽象策略类接口实现某种具体算法
环境类:维护一个对抽象策略类对象的引用。可定义一个接口来让抽象策略类访问他的数据。

抽象策略类:
//定义了抽象策略类,战斗方式
public interface IStrategy {
public void fighting();
}

具体策略类:
public class Ak47 implements IStrategy {
@Override
public void fighting() {
System.out.println(“使用AK47,dadada!”);
}
}

public class M24 implements IStrategy {
@Override
public void fighting() {
System.out.println(“使用m24,dewu~”);
}
}

public class M416 implements IStrategy {
@Override
public void fighting() {
System.out.println(“使用M416,dedede!”);
}
}

3.环境类:
public class Context {
private IStrategy iStrategy;//里氏代换原则
public Context(IStrategy strategy){
this.iStrategy=strategy;
}
public void fighting(){
this.iStrategy.fighting();
}
}

使用:
//策略模式
Context context;
context=new Context(new Ak47());
context.fighting();
context=new Context(new M24());
context.fighting();
context=new Context(new M416());
context.fighting();
输出结果:
I/System.out: 使用AK47,dadada!
I/System.out: 使用m24,dewu~
使用M416,dedede!
思考:适配器模式和策略模式的区别:
适配器模式是在于同一东西在不同环境有不同的表现,类似于,武器的升级
策略模式是同一种环境同一种行为不同的表现形式,比如,射击时武器的更换
比如人选择旅游出行方式

策略模式优点:提供了对开闭原则的完美支持,用户可以在不修改原有系统的基础上选择算法或行为,也可以灵活的增加新的算法或行为。
策略模式提供了管理相关的算法族的办法
策略模式提供了可以替换继承关系的办法
使用策略模式可以避免使用多重条件转移语句
缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类,策略模式将造成产生很多策略类
策略模式适用环境
如果在一个系统里面有许多类,它们之间的区别仅
在于它们的行为,那么使用策略模式可以动态地让
一个对象在许多行为中选择一种行为。
一个系统需要动态地在几种算法中选择一种。
不希望客户端知道复杂的、与算法相关的数据结构
,在具体策略类中封装算法和相关的数据结构,提
高算法的保密性与安全性。

6.1组合模式
环境:用户想表示对象的部分与整体的层次结构,并希望忽略组合对象与单个对象的不同,统一地使用组合结构中的所有对象。描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无需对他们进行区分,可以一致的对待容器对象和叶子对象。解决树形结构的问题。
组合模式三个角色:
抽象组件类:组合中的对象声明接口,实现所有类共有接口的行为。声明用于访问和管理抽象组件类的子部件的接口。
叶子节点:叶节点对象,叶节点没有子节点。由于叶子节点不能添加分支和树叶,所以叶节点的add和remove没有实际意义。
组件集合类:实现抽象组件类的相关操作,比如add和remove操作。其中包含抽象组件类的容器,用来存储叶子节点集合,有叶节点行为,用来存储叶节点集合

组合模式实现步骤:

定义抽象组件接口
实现叶子节点类,实现抽象组件类的接口
实现组件集合类,实现抽象组件类的接口
定义环境类,将叶子节点和组件集合加入根组件集合
7.1 装饰模式
环境:汽车4s店汽车销售店,用户可以挑选汽车的型号奥迪A1,A4,A6。可装饰的组件倒车雷达,真皮座椅,gps定位。用户可以挑选汽车的型号,加任意的组件。

不必改变原类文件和使用继承的情况下,动态的扩展一个对象的功能,应用程序的可维护性,可扩展性差。

装饰模式中的角色:
油漆工:用来刷油漆,给被装饰着进行装饰的
被修饰者:实现装饰模式有很多形式,最常见的一种就是 “实现被装饰者类----定义被装饰者对象----使用被装饰者对象产生装饰者对象”

装饰模式的实现:
首先定义被装饰者类
通过被装饰者对象产生装饰者对象

解决的问题:如何动态的给一个对象添加功能。
解决方案是利用子对象,委派

8.1状态模式
环境:实现一个旅馆的住宿管理系统,房间有三种状态:空闲,预定,已住
状态模式:允许对象在其内部状态改变的时候改变它的行为。
角色:
环境类:客户使用他的对象类。维护一个抽象状态子类的实例,这个实例定义当前状态。
抽象状态类:定义一个接口来封装与环境类的一个特定状态相关的行为
具体状态类:每一个子类实现与环境类的一个状态相关的行为

实现步骤:定义状态类接口,实现当前系统的真实状态实现此接口
定义环境类,具有状态的类,包含状态类接口的对象
当环境类执行某个接口的方法时,去调用真实状态类的实现方法
当环境类修改状态时,修改环境类的真实状态对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值