java设计模式:03-结构型模式-概览

结构型模式(Structural Patterns)

结构型模式(Structural Patterns)主要关注类和对象的组合方式,旨在通过不同的结构组合方式来建立新的功能。结构型模式可以帮助开发者确保即使对象组合方式改变,也能保持系统的整体结构和功能的一致性,提高代码的可扩展性和复用性。

1. 适配器模式 (Adapter Pattern)

定义:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。
详细释义:适配器模式通过创建一个适配器类,将一个类的接口转换为客户期望的另一个接口,从而使得原本由于接口不兼容而无法一起工作的类可以一起工作。适配器可以是对象适配器(通过组合实现)或类适配器(通过继承实现)。

// 目标接口
public interface Target {
    void request();
}

// 需要适配的类
public class Adaptee {
    public void specificRequest() {
        System.out.println("Specific request");
    }
}

// 对象适配器
public class Adapter implements Target {
    private Adaptee adaptee;

    public Adapter(Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    public void request() {
        adaptee.specificRequest();
    }
}

2. 桥接模式 (Bridge Pattern)

定义:将抽象部分与实现部分分离,使它们可以独立变化。
详细释义:桥接模式通过将抽象部分与其具体实现分离,使得它们可以独立变化。抽象部分定义高层控制逻辑,而具体实现部分则负责底层具体操作。这种模式通过在抽象部分和实现部分之间引入桥接接口,使得它们之间的依赖关系变得更加灵活和可扩展。

// 实现部分接口
public interface Implementor {
    void operationImpl();
}

// 具体实现部分A
public class ConcreteImplementorA implements Implementor {
    public void operationImpl() {
        System.out.println("ConcreteImplementorA operation");
    }
}

// 抽象部分
public abstract class Abstraction {
    protected Implementor implementor;

    protected Abstraction(Implementor implementor) {
        this.implementor = implementor;
    }

    public abstract void operation();
}

// 扩展抽象部分
public class RefinedAbstraction extends Abstraction {
    public RefinedAbstraction(Implementor implementor) {
        super(implementor);
    }

    public void operation() {
        implementor.operationImpl();
    }
}

3. 组合模式 (Composite Pattern)

定义:将对象组合成树形结构以表示“部分-整体”的层次结构,使得客户可以统一地对待单个对象和组合对象。
详细释义:组合模式允许你将对象组合成树形结构以表示“部分-整体”的层次结构,从而使客户可以统一地对待单个对象和组合对象。这种模式对于那些希望通过递归组合复杂对象的情况特别有效。

// 组件接口
public interface Component {
    void operation();
}

// 叶子组件
public class Leaf implements Component {
    public void operation() {
        System.out.println("Leaf operation");
    }
}

// 组合组件
public class Composite implements Component {
    private List<Component> children = new ArrayList<>();

    public void add(Component component) {
        children.add(component);
    }

    public void remove(Component component) {
        children.remove(component);
    }

    public void operation() {
        for (Component component : children) {
            component.operation();
        }
    }
}

4. 装饰模式 (Decorator Pattern)

定义:动态地给对象添加职责,通过创建一个装饰类来包装原始类。
详细释义:装饰模式通过创建一个装饰类来包装原始类,从而在不改变原始类的情况下动态地给对象添加职责。装饰模式允许你在运行时扩展对象的功能,并且比继承更灵活。

// 组件接口
public interface Component {
    void operation();
}

// 具体组件
public class ConcreteComponent implements Component {
    public void operation() {
        System.out.println("ConcreteComponent operation");
    }
}

// 装饰抽象类
public abstract class Decorator implements Component {
    protected Component component;

    public Decorator(Component component) {
        this.component = component;
    }

    public void operation() {
        component.operation();
    }
}

// 具体装饰类
public class ConcreteDecorator extends Decorator {
    public ConcreteDecorator(Component component) {
        super(component);
    }

    public void operation() {
        super.operation();
        addedBehavior();
    }

    private void addedBehavior() {
        System.out.println("ConcreteDecorator added behavior");
    }
}

5. 外观模式 (Facade Pattern)

定义:为子系统中的一组接口提供一个一致的界面,使得子系统更容易使用。
详细释义:外观模式通过为子系统中的一组接口提供一个一致的界面,简化了复杂系统的使用。外观模式使得子系统更容易使用,隐藏了其复杂性,提供了一个简单的接口供客户端调用。

public class SubsystemA {
    public void operationA() {
        System.out.println("SubsystemA operation");
    }
}

public class SubsystemB {
    public void operationB() {
        System.out.println("SubsystemB operation");
    }
}

public class Facade {
    private SubsystemA subsystemA;
    private SubsystemB subsystemB;

    public Facade() {
        subsystemA = new SubsystemA();
        subsystemB = new SubsystemB();
    }

    public void operation() {
        subsystemA.operationA();
        subsystemB.operationB();
    }
}

6. 享元模式 (Flyweight Pattern)

定义:使用共享对象来有效地支持大量细粒度的对象。
详细释义:享元模式通过共享来减少大量细粒度对象的数量,从而节省内存。享元模式将对象的状态分为内部状态和外部状态,内部状态是共享的,不会随环境变化,而外部状态是依赖于环境的,可以根据需要进行变化。

public interface Flyweight {
    void operation(String extrinsicState);
}

public class ConcreteFlyweight implements Flyweight {
    private String intrinsicState;

    public ConcreteFlyweight(String intrinsicState) {
        this.intrinsicState = intrinsicState;
    }

    public void operation(String extrinsicState) {
        System.out.println("IntrinsicState: " + intrinsicState + ", ExtrinsicState: " + extrinsicState);
    }
}

public class FlyweightFactory {
    private Map<String, Flyweight> flyweights = new HashMap<>();

    public Flyweight getFlyweight(String key) {
        if (!flyweights.containsKey(key)) {
            flyweights.put(key, new ConcreteFlyweight(key));
        }
        return flyweights.get(key);
    }
}

7. 代理模式 (Proxy Pattern)

定义:为另一个对象提供一个代理以控制对这个对象的访问。
详细释义:代理模式通过为某个对象提供一个代理对象,控制对这个对象的访问。代理模式可以用于延迟实例化、控制访问权限、记录日志等。代理对象和实际对象实现相同的接口,从而实现对实际对象的控制和管理。

public interface Subject {
    void request();
}

public class RealSubject implements Subject {
    public void request() {
        System.out.println("RealSubject request");
    }
}

public class Proxy implements Subject {
    private RealSubject realSubject;

    public void request() {
        if (realSubject == null) {
            realSubject = new RealSubject();
        }
        realSubject.request();
    }
}

这些结构型模式通过不同的对象组合方式,提供了灵活的系统结构,提高了代码的可扩展性和复用性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值