1. 适配器模式(Adapter Pattern)
1.2 定义
适配器模式用于将一个类的接口转换成客户端希望的另一个接口,使得原本接口不兼容的类可以一起工作。
1.3 侧重点
将不兼容的接口转换为可兼容接口。
提供了中间层,使得原有系统可以复用,同时兼容新的接口。
1.4 使用场景
需要使用已存在的类,但其接口不符合系统要求时。
需要创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即适配的类)协同工作。
1.5 示例代码(Java)
interface Target {
void request();
}
class Adaptee {
public void specificRequest() {
System.out.println("Adaptee's specific request");
}
}
class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specificRequest();
}
}
2. 桥接模式(Bridge Pattern)
2.1 定义
桥接模式将抽象部分与实现部分分离,使它们可以独立变化,达到解耦的目的。
2.2 侧重点
分离抽象和实现,降低耦合度。 提高系统的灵活性,可以独立地变化抽象部分和实现部分。
2.3 使用场景
需要避免抽象和实现部分固定绑定在一起,可以独立变化时。 一个类存在多个独立变化的维度,且这些维度需要独立扩展。
2.4 示例代码(Java)
interface Implementor {
void operationImpl();
}
class ConcreteImplementorA implements Implementor {
@Override
public void operationImpl() {
System.out.println("ConcreteImplementorA operation");
}
}
class ConcreteImplementorB implements Implementor {
@Override
public void operationImpl() {
System.out.println("ConcreteImplementorB operation");
}
}
abstract class Abstraction {
protected Implementor implementor;
public void setImplementor(Implementor implementor) {
this.implementor = implementor;
}
public abstract void operation();
}
class RefinedAbstraction extends Abstraction {
@Override
public void operation() {
System.out.print("RefinedAbstraction: ");
implementor.operationImpl();
}
}
3. 组合模式(Composite Pattern)
3.1 定义
组合模式用于将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。
3.2 侧重点
将对象组合成树形结构,用户可以一致对待单个对象和组合对象。
客户端可以忽略组合对象和单个对象之间的差异,简化了客户端代码。
3.3 使用场景
当你想表示对象的部分-整体层次结构时。
希望客户端能够以一致的方式处理个别对象和对象的组合。
3.4 示例代码(Java)
import java.util.ArrayList;
import java.util.List;
interface Component {
void operation();
}
class Leaf implements Component {
private String name;
public Leaf(String name) {
this.name = name;
}
@Override
public void operation() {
System.out.println("Leaf " + name + " operation");
}
}
class Composite implements Component {
private List<Component> components = new ArrayList<>();
public void add(Component component) {
components.add(component);
}
@Override
public void operation() {
System.out.println("Composite operation:");
for (Component component : components) {
component.operation();
}
}
}
4. 装饰器模式(Decorator Pattern)
4.1 定义
装饰器模式动态地给一个对象添加一些额外的职责,而不改变其结构。
4.2 侧重点
不改变原有对象的结构,而是给对象动态地增加一些功能。
以透明的方式扩展对象的功能,避免继承带来的静态特性。
4.3 使用场景
在不改变现有对象结构的情况下,动态地给一个对象增加功能。
需要扩展一个类的功能,或者给一个类添加附加职责。
4.4 示例代码(Java)
interface Component {
void operation();
}
class ConcreteComponent implements Component {
@Override
public void operation() {
System.out.println("ConcreteComponent operation");
}
}
abstract class Decorator implements Component {
protected Component component;
public Decorator(Component component) {
this.component = component;
}
@Override
public void operation() {
component.operation();
}
}
class ConcreteDecoratorA extends Decorator {
public ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
System.out.println("ConcreteDecoratorA operation");
}
}
class ConcreteDecoratorB extends Decorator {
public ConcreteDecoratorB(Component component) {
super(component);
}
@Override
public void operation() {
super.operation();
System.out.println("ConcreteDecoratorB operation");
}
}
5. 外观模式(Facade Pattern)
5.1 定义
外观模式为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口。
5.2 侧重点
提供一个简单的接口,隐藏系统的复杂性,方便客户端使用。
将客户端与子系统解耦,降低了客户端对子系统的依赖。
5.3 使用场景
当需要为复杂子系统提供一个简单接口时。
当客户端与多个子系统交互时,通过外观模式封装子系统的交互,降低耦合度。
5.4 示例代码(Java)
class Subsystem1 {
public void operation1() {
System.out.println("Subsystem1 operation1");
}
}
class Subsystem2 {
public void operation2() {
System.out.println("Subsystem2 operation2");
}
}
class Subsystem3 {
public void operation3() {
System.out.println("Subsystem3 operation3");
}
}
class Facade {
private Subsystem1 subsystem1;
private Subsystem2 subsystem2;
private Subsystem3 subsystem3;
public Facade() {
subsystem1 = new Subsystem1();
subsystem2 = new Subsystem2();
subsystem3 = new Subsystem3();
}
public void operate() {
subsystem1.operation1();
subsystem2.operation2();
subsystem3.operation3();
}
}
6. 享元模式(Flyweight Pattern)
6.1 定义
享元模式通过共享技术实现相同或相似对象的重用,减少内存占用和提高性能。
6.2 侧重点
尽量减少对象的创建,通过共享现有对象实现复用。
区分内部状态和外部状态,减少存储内部状态造成的内存消耗。
6.3 使用场景
系统中存在大量相似对象,可以共享对象来减少内存占用。
对象的大部分状态可以外部化,可以将外部状态传入对象。
6.4 示例代码(Java)
import java.util.HashMap;
import java.util.Map;
class Flyweight {
private String intrinsicState;
public Flyweight(String intrinsicState) {
this.intrinsicState = intrinsicState;
}
public void operation(String extrinsicState) {
System.out.println("Intrinsic State: " + intrinsicState);
System.out.println("Extrinsic State: " + extrinsicState);
}
}
class FlyweightFactory {
private Map<String, Flyweight> flyweights = new HashMap<>();
public Flyweight getFlyweight(String key) {
if (!flyweights.containsKey(key)) {
flyweights.put(key, new Flyweight(key));
}
return flyweights.get(key);
}
}
7. 代理模式(Proxy Pattern)
7.1 定义
代理模式为其他对象提供一种代理以控制对这个对象的访问。
7.2 侧重点
控制对原始对象的访问,可以在访问时进行一些控制或附加操作。
通过代理类来间接访问目标对象,保护目标对象、增强目标对象或控制访问目标对象。
7.3 使用场景
需要控制对对象的访问,可以在代理类中增加控制逻辑。
需要在访问对象时附加一些额外操作,比如权限验证、缓存等。
7.4 示例代码(Java)
interface Subject {
void request();
}
class RealSubject implements Subject {
@Override
public void request() {
System.out.println("RealSubject handles the request.");
}
}
class Proxy implements Subject {
private RealSubject realSubject;
public Proxy() {
this.realSubject = new RealSubject();
}
@Override
public void request() {
// Perform some additional operations
System.out.println("Proxy handles the request.");
realSubject.request();
}
}
以上是结构型模式的详解和示例代码。每种模式都有其特定的用途和适用场景,根据具体的开发需求选择合适的模式来提高代码质量。
版权声明: 闲者 发表于 2024-08-06
转载请注明: Java设计模式三 - 结构型模式 | Java设计模式三 - 结构型模式 - 无界文档,Java设计模式三 - 结构型模式
暂无评论...