Java高级设计模式:从Bridge到Visitor
设计模式是经过验证的软件架构典型问题解决方案。如果基础设计模式(Singleton、Factory、Observer)对每位Java开发者来说都已耳熟能详,那么高级设计模式则常常被忽略。本文将深入解析三种强大的设计模式:Bridge、Visitor和Memento。您将了解它们的适用场景,并获得可直接使用的Java代码示例。
1. Bridge(桥接模式)—— 分离抽象与实现
Bridge模式用于将抽象部分与其实现部分分离,使它们可以独立变化。当存在多个变化维度时(例如不同类型的设备和不同的遥控器),该模式尤为实用。
适用场景:当您希望避免因不同选项组合而导致的“类爆炸”时。
示例:设备控制
假设我们有遥控器(Remote)和设备(Device)。我们希望同一个遥控器能控制不同设备(电视、收音机)。
// 实现(Device)interface Device { void turnOn(); void turnOff(); void setVolume(int percent);}
class TV implements Device { @Override public void turnOn() { System.out.println("电视已开启"); } @Override public void turnOff() { System.out.println("电视已关闭"); } @Override public void setVolume(int percent) { System.out.println("电视音量:" + percent + "%"); }}
class Radio implements Device { @Override public void turnOn() { System.out.println("收音机已开启"); } @Override public void turnOff() { System.out.println("收音机已关闭"); } @Override public void setVolume(int percent) { System.out.println("收音机音量:" + percent + "%"); }}
// 抽象(Remote)abstract class Remote { protected Device device;
public Remote(Device device) { this.device = device; }
public abstract void togglePower(); public abstract void volumeUp(); public abstract void volumeDown();}
class BasicRemote extends Remote { private boolean isOn = false; private int volume = 10;
public BasicRemote(Device device) { super(device); }
@Override public void togglePower() { if (isOn) { device.turnOff(); isOn = false; } else { device.turnOn(); isOn = true; } }
@Override public void volumeUp() { volume += 5; device.setVolume(volume); }
@Override public void volumeDown() { volume -= 5; device.setVolume(volume); }}
// 使用示例public class BridgeDemo { public static void main(String[] args) { Device tv = new TV(); Remote remote = new BasicRemote(tv); remote.togglePower(); // 电视已开启 remote.volumeUp(); // 电视音量:15%
Device radio = new Radio(); remote = new BasicRemote(radio); remote.togglePower(); // 收音机已开启 remote.volumeUp(); // 收音机音量:15% }}优势:我们可以在不修改现有代码的情况下添加新类型的设备或新的遥控器。Bridge模式非常适合跨平台应用(例如不同操作系统上的UI)。
2. Visitor(访问者模式)—— 在不修改类的前提下添加新操作
Visitor模式允许您为一组对象添加新的操作,而无需修改这些对象本身的类。这是绕过Java单分派限制的经典方法。
适用场景:当您拥有稳定的类层次结构,但需要频繁添加新操作时(例如导出为不同格式、生成报告)。
示例:将图形导出为不同格式
我们有一些图形