在之前的对话中,我们讨论了五种常见的 Java 设计模式:单例、工厂、策略、装饰器和观察者模式。现在,让我们继续探索其他四种设计模式:适配器、桥接、组合和迭代器模式。
概念:
适配器模式是一种结构型设计模式,用于将一个类的接口转换为另一个类期望的接口。适配器模式可以让原本由于接口不兼容而不能一起工作的类可以进行交互。
使用场景:
优点:
缺点:
使用注意事项:
代码示例:
// Target interface
public interface Volt3 {
public void getVolt();
}
// Adaptee class
public class Volt220 {
public void get220Volt() {
System.out.println("220 volts");
}
}
// Adapter class
public class VoltAdapter implements Volt3 {
private Volt220 volt220;
public VoltAdapter(Volt220 volt220) {
this.volt220 = volt220;
}
@Override
public void getVolt() {
volt220.get220Volt();
}
}
// Usage
public class Main {
public static void main(String[] args) {
Volt220 volt220 = new Volt220();
Volt3 volt3 = new VoltAdapter(volt220);
volt3.getVolt();
}
}
概念:
桥接模式是一种结构型设计模式,用于将抽象部分与实现部分分离,使它们可以独立变化。桥接模式可以在运行时选择或切换实现。
使用场景:
优点:
缺点:
使用注意事项:
代码示例:
// Abstraction
public abstract class Shape {
protected DrawAPI drawAPI;
protected Shape(DrawAPI drawAPI){
this.drawAPI = drawAPI;
}
public abstract void draw();
}
// Refined Abstraction
public class Circle extends Shape {
private int x, y, radius;
public Circle(int x, int y, int radius, DrawAPI drawAPI) {
super(drawAPI);
this.x = x;
this.y = y;
this.radius = radius;
}
@Override
public void draw() {
drawAPI.drawCircle(x, y, radius);
}
}
// Implementor
public interface DrawAPI {
void drawCircle(int x, int y, int radius);
}
// Concrete Implementor
public class DrawAPI1 implements DrawAPI {
@Override
public void drawCircle(int x, int y, int radius) {
System.out.println("Drawing circle using DrawAPI1");
}
}
// Concrete Implementor
public class DrawAPI2 implements DrawAPI {
@Override
public void drawCircle(int x, int y, int radius) {
System.out.println("Drawing circle using DrawAPI2");
}
}
// Usage
public class Main {
public static void main(String[] args) {
Shape circle1 = new Circle(1, 2, 3, new DrawAPI1());
Shape circle2 = new Circle(5, 6, 7, new DrawAPI2());
circle1.draw();
circle2.draw();
}
}
概念:
组合模式是一种结构型设计模式,用于表示部分-整体层次结构。组合模式让你可以将对象组合成树形结构来表示部分-整体的层次关系。
使用场景:
优点:
缺点:
使用注意事项:
代码示例:
// Component
public interface Component {
void operation();
}
// Leaf
public class Leaf implements Component {
private String name;
public Leaf(String name) {
this.name = name;
}
@Override
public void operation() {
System.out.println("Leaf " + name + " is doing something");
}
}
// Composite
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);
}
@Override
public void operation() {
for (Component component : children) {
component.operation();
}
}
}
// Usage
public class Main {
public static void main(String[] args) {
Composite composite1 = new Composite();
Composite composite2 = new Composite();
Leaf leaf1 = new Leaf("Leaf 1");
Leaf leaf2 = new Leaf("Leaf 2");
Leaf leaf3 = new Leaf("Leaf 3");
composite1.add(leaf1);
composite1.add(leaf2);
composite2.add(leaf3);
composite2.add(composite1);
composite2.operation();
}
}
概念:
迭代器模式是一种行为型设计模式,用于遍历集合对象。迭代器模式可以隐藏集合对象的内部实现细节。
使用场景:
优点:
缺点:
使用注意事项:
代码示例:
// Iterator
public interface Iterator {
boolean hasNext();
Object next();
}
// Aggregate
public interface Aggregate {
Iterator createIterator();
}
// Concrete Aggregate
public class ConcreteAggregate implements Aggregate {
private List<Object> list = new ArrayList<>();
public void add(Object object) {
list.add(object);
}
public void remove(Object object) {
list.remove(object);
}
@Override
public Iterator createIterator() {
return new ConcreteIterator(this);
}
}
// Concrete Iterator
public class ConcreteIterator implements Iterator {
private ConcreteAggregate aggregate;
private int index = 0;
public ConcreteIterator(ConcreteAggregate aggregate) {
this.aggregate = aggregate;
}
@Override
public boolean hasNext() {
return index < aggregate.list.size();
}
@Override
public Object next() {
Object object = aggregate.list.get(index);
index++;
return object;
}
}
// Usage
public class Main {
public static void main(String[] args) {
ConcreteAggregate aggregate = new ConcreteAggregate();
aggregate.add("Item 1");
aggregate.add("Item 2");
aggregate.add("Item 3");
Iterator iterator = aggregate.createIterator();
while (iterator.hasNext()) {
Object item = iterator.next();
System.out.println(item);
}
}
}
这个示例演示了如何使用迭代器模式来遍历一个集合对象(在本例中是一个列表)。ConcreteAggregate
类是具体的聚合对象,它实现了Aggregate
接口并提供了一个createIterator()
方法来返回一个迭代器对象。ConcreteIterator
类是具体的迭代器对象,它实现了Iterator
接口并提供了hasNext()
和next()
方法来遍历聚合对象中的元素。最后,在Main
类中,我们创建了一个ConcreteAggregate
对象,添加了一些元素,然后使用迭代器对象来遍历并打印每个元素。
以上就是适配器、桥接、组合和迭代器模式的简要介绍。这些设计模式在解决特定类型的问题时都有其独特的优势和适用场景。掌握这些模式可以帮助我们编写更灵活、更可维护和更可扩展的代码。