设计模式:代码界的“武林秘籍”——深入浅出解读三大类设计模式
一、设计模式的四大核心要素
(想象你是个刚入门的程序员,正在参加“代码江湖大会”,突然被长老拉到一旁传授秘籍——)
1. 模式名称
“这是‘单例模式’,别问为什么叫这个名字,问就是皇帝只有一个!”
“适配器模式?就是把Type-C转成Lightning的充电器!”
2. 问题
“我明明要一个对象,为啥总被造出一堆?!”(单例模式的痛点)
“两个系统接口像在说不同语言,怎么对话?”(适配器模式的困境)
3. 解决方案
“私有构造函数+全局访问点,这波操作666!”(单例模式的解决方案)
“造个中间人,把接口翻译成对方能听懂的!”(适配器模式的妙招)
4. 效果
“内存省了,资源不乱用了,还能防皇帝被篡位!”(单例模式的战果)
“旧系统和新系统握手言和,数据终于能自由流通了!”(适配器模式的胜利)
二、创建型设计模式:造物主的四大神器
1. 单例模式(Singleton)
问题:皇帝想搞终身制,但总被造出多个“分身”。
解决方案:
private static Emperor instance = new Emperor();
private Emperor() {} // 私有构造函数:禁止民间造反!
public static Emperor getInstance() { return instance; }
效果:内存里只保留一个“真命天子”,资源占用率降为0.5%(比普通百姓还省)。
2. 工厂模式(Factory Method)
问题:造车时客户总问“要燃油版还是电车?”,代码写得像超市收银台。
解决方案:
// 父类:造车工厂
public abstract class CarFactory {
public abstract Car createCar();
}
// 子类:电动车工厂
class TeslaFactory extends CarFactory {
@Override
public Car createCar() { return new ElectricCar(); }
}
效果:客户只需说“我要特斯拉”,代码自动造车,连4S店销售都失业了!
3. 建造者模式(Builder)
问题:点奶茶时要求“大杯去冰三分糖+波霸+珍珠+椰果”,参数多到爆表。
解决方案:
// 奶茶建造者
public class BubbleTeaBuilder {
private String size;
private boolean ice;
private List<Topping> toppings = new ArrayList<>();
// 各种setter方法
public BubbleTea build() { return new BubbleTea(this); }
}
效果:菜单参数从17个精简到0,顾客只需说“照常!”,代码自动复用上次的“波霸狂魔”配方。
三、结构型设计模式:搭积木的高手
1. 适配器模式(Adapter)
场景:你的Type-C充电器遇到Lightning接口的苹果手机。
解决方案:
// 适配器类
class TypeCAdapter implements LightningInterface {
private TypeCInterface typeC;
public TypeCAdapter(TypeCInterface typeC) {
this.typeC = typeC;
}
public void chargeWithLightning() {
typeC.chargeWithTypeC();
}
}
效果:苹果手机终于能用你的充电器,双方CEO握手言和。
2. 装饰器模式(Decorator)
场景:711便利店的“可乐+冰块+柠檬+薄荷叶”组合,价格随心叠加。
解决方案:
// 抽象饮料类
abstract class Beverage {
public abstract String getDescription();
public abstract double cost();
}
// 装饰器抽象类
abstract class CondimentDecorator extends Beverage {
protected Beverage beverage;
}
// 具体装饰:加柠檬
class LemonDecorator extends CondimentDecorator {
public LemonDecorator(Beverage beverage) {
this.beverage = beverage;
}
@Override
public String getDescription() {
return beverage.getDescription() + ", 柠檬";
}
@Override
public double cost() {
return beverage.cost() + 1.5;
}
}
效果:顾客可以自由组合“可乐+冰+柠檬+薄荷”,代码像搭乐高一样灵活。
四、行为型设计模式:代码世界的“社交关系学”
1. 观察者模式(Observer)
场景:天气预报APP,你订阅了“下雨提醒”,系统自动推送。
解决方案:
// 天气主题
public class WeatherSubject {
private List<Observer> observers = new ArrayList<>();
public void addObserver(Observer o) { observers.add(o); }
public void notifyObservers() {
for (Observer o : observers) o.update();
}
}
// 订阅者
class User implements Observer {
public void update() { System.out.println("下雨啦!快收衣服!"); }
}
效果:天气变化时,所有订阅用户自动收到通知,像微信群发一样高效。
2. 策略模式(Strategy)
场景:打车软件的“经济/舒适/豪华”模式切换。
解决方案:
// 计价策略接口
interface PricingStrategy {
double calculatePrice(double distance);
}
// 具体策略:经济模式
class EconomyStrategy implements PricingStrategy {
public double calculatePrice(double distance) {
return distance * 1.5;
}
}
// 上下文类
class RideContext {
private PricingStrategy strategy;
public void setStrategy(PricingStrategy s) { strategy = s; }
public double getPrice(double distance) {
return strategy.calculatePrice(distance);
}
}
效果:用户切换车型时,代码就像换衣服一样简单,连司机都夸“这系统快得像开挂”。
3. 责任链模式(Chain of Responsibility)
场景:公司请假流程:1天找组长,3天找总监,5天找CEO。
解决方案:
// 请假请求
class LeaveRequest {
private int days;
public LeaveRequest(int days) { this.days = days; }
public int getDays() { return days; }
}
// 审批者抽象类
abstract class Approver {
protected Approver nextApprover;
public void setNext(Approver next) { this.nextApprover = next; }
public abstract void processRequest(LeaveRequest request);
}
// 具体审批者:组长
class TeamLeader extends Approver {
public void processRequest(LeaveRequest request) {
if (request.getDays() <= 1) {
System.out.println("组长批准了1天假");
} else {
nextApprover.processRequest(request);
}
}
}
效果:请假流程自动流转,再也不用员工追着领导跑,效率提升200%!
五、为什么设计模式这么“香”?
- 代码复用:就像用乐高积木搭房子,一套零件能造出千种造型。
- 可维护性:当系统升级时,就像给手机换系统——旧应用还能用,新功能也能加。
- 沟通效率:当你说“我用了观察者模式”,队友立刻知道你在实现“订阅-通知”机制。
最后送你一句程序员名言:
“设计模式不是万能钥匙,但没有它,你连门都找不到。”
下次写代码时,记得看看这23种“秘籍”,说不定就能让代码从“凑合用”变成“优雅飞”!