目录
1.java设计模式的六大设计原则以及它们的关系。
2.单例模式、适配器模式、装饰者模式、代理模式、外观模式、策略模式、观察者模式、责任链模式、命令模式、状态模式、中介者模式。这十一种常用的设计模式是考核的重点,你需要掌握它们的优缺点以及使用的场景。
3.适配器模式,装饰者模式,外观模式它们之间的区别是什么。
4.代理模式、策略模式、状态模式它们之间的区别是什么。
5.外观模式、中介模式它们之间的区别是什么。
6.静态代理和动态代理的区别,什么场景使用,实现动态代理的几种方式。 7.简单列举几个Android源码中使用到设计模式的例子
1.java设计模式的六大设计原则以及它们的关系。
-
单一职责原则(SRP):
- 每个类应该只有一个职责,即只有一个导致其变化的原因。
- 优点:降低类的复杂度,提高代码的可读性和可维护性。
-
开闭原则(OCP):
- 软件实体(类、模块、函数等)应该对扩展开放,对修改关闭。
- 优点:提高软件系统的可扩展性和可维护性。
-
里氏替换原则(LSP):
- 子类对象可以替换父类对象,并且程序行为不变。
- 优点:确保程序的正确性和健壮性。
-
依赖倒置原则(DIP):
- 高层模块不应该依赖于低层模块,两者都应该依赖于抽象。
- 优点:减少类之间的耦合性,提高系统的灵活性和可扩展性。
-
接口隔离原则(ISP):
- 客户端不应该依赖于它不需要的接口。
- 优点:减少类之间的依赖,提高系统的灵活性和可维护性。
-
迪米特法则(最少知道原则,LoD):
- 一个对象应该对其他对象有最少的了解。
- 优点:降低类之间的耦合性,提高系统的可维护性和扩展性。
2.单例模式、适配器模式、装饰者模式、代理模式、外观模式、策略模式、观察者模式、责任链模式、命令模式、状态模式、中介者模式。这十一种常用的设计模式是考核的重点,你需要掌握它们的优缺点以及使用的场景。
-
单例模式:
- 优点:确保一个类只有一个实例,提供一个全局访问点。
- 缺点:难以扩展,违反单一职责原则。
- 使用场景:日志记录器、配置管理、线程池等。
-
适配器模式:
- 优点:将不兼容的接口转换为兼容的接口。
- 缺点:增加系统的复杂性。
- 使用场景:旧系统与新系统的集成、第三方库的使用等。
-
装饰者模式:
- 优点:动态地给对象添加新的功能。
- 缺点:产生过多的小对象,增加系统复杂性。
- 使用场景:需要动态扩展功能的场景。
-
代理模式:
- 优点:控制对对象的访问,减少系统的耦合性。
- 缺点:增加系统复杂性。
- 使用场景:远程代理、虚拟代理、安全代理等。
-
外观模式:
- 优点:提供一个简单的接口,减少系统的复杂性。
- 缺点:增加系统的复杂性。
- 使用场景:子系统复杂且需要统一接口时。
-
策略模式:
- 优点:定义一系列算法,将每个算法封装起来,使它们可以互换。
- 缺点:客户端必须知道所有策略类,增加系统复杂性。
- 使用场景:需要动态选择算法的场景。
-
观察者模式:
- 优点:定义对象之间的一对多依赖,当一个对象改变状态时,其依赖者都会收到通知。
- 缺点:可能导致内存泄漏。
- 使用场景:事件处理系统、订阅-发布系统等。
-
责任链模式:
- 优点:解耦请求发送者和处理者,动态组合处理链。
- 缺点:不能保证请求一定被处理。
- 使用场景:请求的处理需要多个对象的协作时。
-
命令模式:
- 优点:将请求封装为对象,参数化请求。
- 缺点:可能产生大量的命令类。
- 使用场景:需要对请求进行记录、撤销、重做等操作时。
-
状态模式:
- 优点:允许对象在内部状态改变时改变其行为。
- 缺点:可能导致状态类增加,系统复杂性增加。
- 使用场景:对象的行为依赖于其状态变化的场景。
-
中介者模式:
- 优点:用一个中介对象来封装一系列对象的交互,减少对象之间的耦合。
- 缺点:中介者对象本身可能变得复杂。
- 使用场景:对象之间存在复杂交互时。
3.适配器模式,装饰者模式,外观模式它们之间的区别是什么。
- 适配器模式:将一个类的接口转换成客户希望的另一个接口。适用于接口不兼容的情况。
- 装饰者模式:动态地给对象添加新的功能。适用于需要动态扩展功能的情况。
- 外观模式:提供一个统一的接口,用来访问子系统中的一群接口。适用于子系统复杂且需要统一接口的情况。
4.代理模式、策略模式、状态模式它们之间的区别是什么。
- 代理模式:为其他对象提供一个代理,以控制对这个对象的访问。主要用于访问控制和性能优化。
- 策略模式:定义一系列算法,并将每个算法封装起来,使它们可以互换。主要用于算法的动态选择。
- 状态模式:允许对象在内部状态改变时改变其行为。主要用于对象的行为依赖于其状态变化的场景。
5.外观模式、中介模式它们之间的区别是什么。
- 外观模式:为子系统中的一组接口提供一个一致的接口,使得子系统更容易使用。主要用于简化子系统的使用。
- 中介者模式:通过一个中介对象来封装对象之间的交互。主要用于减少对象之间的直接交互和耦合。
6.静态代理和动态代理的区别,什么场景使用,实现动态代理的几种方式。
-
静态代理:
- 实现方式:由程序员创建或通过工具生成代理类的源码,并编译。
- 优点:结构简单,易于理解和实现。
- 缺点:代理类与委托类耦合紧密,添加新的代理类需要重新编写代码。
- 使用场景:需要明确代理类的情况下。
-
动态代理:
- 实现方式:在运行时由反射机制动态生成代理类。
- 优点:减少代码量,代理类的逻辑可以复用,增加灵活性。
- 缺点:性能开销较大,调试困难。
- 使用场景:需要灵活生成代理类的情况下。
- 实现方式:Java 动态代理(通过
java.lang.reflect.Proxy
和InvocationHandler
)、CGLIB 动态代理(通过字节码生成)。
7.简单列举几个Android源码中使用到设计模式的例子
- 单例模式:
Context
类中的getSystemService
方法。 - 观察者模式:
BroadcastReceiver
、ContentObserver
。 - 策略模式:
LayoutInflater
中的布局加载策略。 - 责任链模式:
View
的事件分发机制。 - 适配器模式:
RecyclerView.Adapter
。 - 代理模式:
Binder
机制。 - 装饰者模式:
Drawable
类中的LayerDrawable
。