设计模式简答题

1.工厂模式和抽象工厂模式

  1. 他们都有抽象产品、具体产品、抽象工厂和具体工厂。
  2. 工厂方法模式中每一个具体工厂只需要生产一种具体产品,而抽象工厂模式中一个具体工厂可以生产一组相关的具体产品。
  3. 两者最大的区别在于,工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是一个产品族。
  4. 抽象工厂模式中增加新的产品族很方便,但是增加新的产品等级结构很麻烦,抽象工厂模式的这种性质称为开闭原则的倾斜性。

2.适配器模式

简述适配器模式:
如果在系统中存在接口不兼容的两个类,可以通过引入一个适配器来使原本因为接口不兼容的两个类能够协同工作
适配器模式中有Target(目标抽象类)、Adapter(适配器类)、Adaptee(适配者类)。
在这里插入图片描述

适用环境:
(1)系统需要适用一些现有的类,而这些类的接口不符合系统的需要。
(2)想创建一个可以重复使用的类,用于和一些彼此之间没有太大关联的类一起工作。

3.组合模式

简述组合模式:
组合模式使用面向对象的方式来处理树形结构,它为叶子构件和容器构件提供了一个公共的抽象构件类,客户端可以针对抽象构件进行处理,而无须关心所操作的是叶子构件还是容器构件。
组合模式让客户端可以统一对待单个对象和组合对象。
组合模式中有Component(抽象构件)、Leaf(叶子构件)、Composite(容器构件)。在这里插入图片描述
适用环境:
(1)系统中需要处理一个树形结构。
(2)在具有整体和部分的层次结构中希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们。

4.装饰模式

简述装饰模式:
装饰模式可以在不改变对象本身功能的基础上给对象增加额外的新行为。
装饰模式中有Component(抽象构件)、ConcreteComponent(具体构件)、Decorator(抽象装饰类)、ConcreteDecorator(具体装饰类)。
在这里插入图片描述
适用环境:
(1)在不影响其他对象的情况下以动态、透明的方式给单个对象添加职责。
(2)当不能采用继承的方式对系统进行扩展或者采用继承不利于系统扩展和维护时可以使用装饰模式。

5.代理模式

简述代理模式:
当无法直接访问某个对象时可以通过一个代理对象来间接访问。
代理模式中有Subject(抽象主题角色)、Proxy(代理主题角色)、RealSubject(真实主题角色)。
在这里插入图片描述
动态代理:
可以让系统在运行时根据实际需要来动态创建代理类,让同一个代理类能够代理多个不同的真实主题类而且可以代理不同的方法。动态代理是一种较为高级的代理模式,它在事务管理、AOP等领域都发挥了重要的作用。
适用环境:
(1)当客户端需要访问远程主机中的对象时可以使用远程代理
(2)当需要使用一个消耗资源较少的对象来代表一个消耗资源较多的对象时,可以使用虚拟代理从而降低系统开销、缩短运行时间。

6.装饰模式和代理模式的区别

装饰模式关注在一个对象上动态添加方法,而代理模式关注控制对对象的访问。
用代理模式,代理类可以对它的客户端隐藏一个对象的具体信息,因此当使用代理模式时,常常在代理类中使用关联创建对象的实例,而使用装饰模式时,是将原始对象通过构造函数注入到装饰类中。

代理模式和装饰模式其实从另一个角度更容易去理解两个模式的区别:
代理模式更多的是强调对对象的访问控制,比如说,访问A对象的查询功能时,访问B对象的更新功能时,访问C对象的删除功能时,都需要判断对象是否登录,那么我需要将判断用户是否登录的功能提取出来,并对A对象、B对象和C对象进行代理,使访问它们时都需要去判断用户是否登录,简单地说就是将某个控制访问权限应用到多个对象上;而装饰模式更多的强调给对象加强功能,比如说要给只会唱歌的A对象添加跳舞功能,添加说唱功能等,简单地说就是将多个功能附加在一个对象上。

7.门面模式(外观模式)

简述门面模式:
通过引入一个外观角色来简化客户端与子系统之间的交互,为复杂的子系统调用提供一个统一的入口,使得子系统与客户端的耦合度降低,且客户端调用非常方便。
门面模式中有Facade(外观角色)、SubSystem(子系统角色)。
在这里插入图片描述
在这里插入4图片描述
适用环境:
(1)当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式。
(2)客户端程序与多个子系统之间存在很大的依赖性,引入外观类可以将客户端与子系统解耦,从而提高子系统的独立性和可移植性。

8.命令模式

简述命令模式:
命令模式将请求发送者与请求接收者解耦,请求发送者通过命令对象来间接引用接收者,使得系统具有更好的灵活性,可以在不修改现有系统源代码的情况下让相同的发送者对应不同的接收者。
命令模式中有Command(抽象命令类)、ConcreteCommand(具体命令类)、Invoker(调用者)、Receiver(接收者)。
在这里插入图片描述
适用环境:
(1)系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
(2)系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
(3)系统需要将一组操作组合在一起形成宏命令。

9.策略模式

简述策略模式:
策略模式对应于解决某一问题的一个算法族,允许用户从该算法族中任选一个算法解决某一问题,同时可以方便地更换或者增加新的算法。
策略模式中有Context(环境类)、Strategy(抽象策略类)、ConcreteStrategy(具体策略类)。
在这里插入图片描述
适用环境:
(1)当很多相关类只在它们的行为的实现上不一样时,策略模式提供了一个很好的方式来配置某个类,让其具有上述多种实现之一。
(2)当我们需要同一个行为的不同的实现的时候,策略模式可以用作实现这些变体。
(3)算法需要用到一些数据,而这些数据不应该被用户知道,这时我们可以通过策略模式隐藏复杂的算法和数据接口。
(4)一个类定义了很多行为,这些行为作为一个switch选择语句的分支执行部分,这时策略模式可以消除这些分支选择。

10.状态模式

简述状态模式:
当系统中的某个对象存在多个状态,这些状态之间可以进行转换,而且对象在不同状态下行为不相同时可以使用状态模式。
状态模式中有Context(环境类)、State(抽象状态类)、ConcreteState(具体状态类)。
在这里插入图片描述
适用环境:
(1)对象的行为依赖于它的状态,状态的改变将导致行为的变化。
(2)在代码中包含大量与对象状态有关的条件语句,这些条件语句的出现会导致代码的可维护性和灵活性变差,不能方便地增加和删除状态。

11.观察者模式

简述观察者模式:
一个对象行为的改变可能会导致一个或多个其他与之存在依赖关系的的对象行为发生改变。观察者模式用于描述对象之间的依赖关系,为多个对象之间的联动提供了一种解决方案。
观察者模式中有Subject(目标)、ConcreteSubject(具体目标)、Observer(观察者)、ConcreterObserver(具体观察者)。在这里插入图片描述
适用环境:
(1)一个对象的改变将导致一个或多个其他对象也发生改变,而并不知道具体有多少对象将发生改变,也不知道这些对象是谁。
(2)需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象,可以使用观察者模式创建一种链式触发机制。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值