网站首页 > java教程 正文
在编程江湖里,你是否经常面对这样的场景:
“这需求怎么又双叒叕变了?!”
“这坨祖传代码谁敢动?!”
“新加个功能怎么牵一发动全身?!”
别慌!Java设计模式就是你的绝世武功秘籍! 它不是什么高深莫测的玄学,而是前辈们用头发换来的高效代码套路。掌握它,让你的代码从“能跑就行”升级为“优雅耐打”!
模式一:单例模式 (Singleton) - “朕的江山,只许一个朕!”
场景: 全局只需一个对象!比如数据库连接池、日志管理器、配置中心。你肯定不想多个连接池打架吧?
灵魂代码(饿汉式,简单粗暴):
java
public class King {
// 登基即存在,稳如泰山
private static final King INSTANCE = new King();
// 私有构造,禁止外部new朕!
private King() {}
// 天下人,只此一处见朕
public static King getInstance() {
return INSTANCE;
}
public void rule() {
System.out.println("朕即天下!");
}
}
// 使用:普天之下,莫非王土
King theOneAndOnly = King.getInstance();
theOneAndOnly.rule(); // 输出:朕即天下!
精髓: private构造 + static final实例 + public static获取方法 = 全局唯一入口!
优势: 节省资源、严格控流、避免状态混乱。
模式二:适配器模式 (Adapter) - “万能转接头,不兼容?不存在!”
场景: 新老系统对接?接口不匹配?别重写!加个“转接头”就行。比如用新支付接口调用老银行系统。
生动演绎:
java
// 老式圆孔插头 (老系统接口)
interface OldPlug {
void roundConnect();
}
// 新式USB-C接口 (新系统接口)
interface UsbC {
void typeCCharge();
}
// 老插头实现:只能插圆孔
class OldRoundPlug implements OldPlug {
@Override
public void roundConnect() {
System.out.println("老式圆孔已连接...");
}
}
// 适配器登场!(让老插头支持USB-C)
class PlugAdapter implements UsbC {
private OldPlug oldPlug; // 内部持有老家伙
public PlugAdapter(OldPlug oldPlug) {
this.oldPlug = oldPlug;
}
@Override
public void typeCCharge() {
System.out.println("适配器工作:将USB-C信号转为圆孔...");
oldPlug.roundConnect(); // 调用老接口功能
}
}
// 使用:新电脑用USB-C给老设备充电!
UsbC myLaptopPort = new PlugAdapter(new OldRoundPlug());
myLaptopPort.typeCCharge(); // 无缝衔接!
精髓: 适配器类实现目标接口,内部持有被适配对象,在目标方法中转换调用被适配对象的方法。
优势: 兼容老代码、平滑升级、降低耦合。
模式三:观察者模式 (Observer) - “我有消息,速来围观!”
场景: 一对多依赖!一个对象(主题)状态变化,所有依赖它的对象(观察者)自动更新。如:订单状态变更通知买家、卖家、物流。
超实用代码:
java
import java.util.*;
// 主题(被观察者,比如订单中心)
class OrderSubject {
private List<Observer> observers = new ArrayList<>(); // 所有观察者
private String orderStatus; // 状态
public void setStatus(String status) {
this.orderStatus = status;
notifyAllObservers(); // 状态变,立即通知!
}
// 添加观察者(买家、卖家、物流...)
public void attach(Observer observer) {
observers.add(observer);
}
// 通知所有观察者
private void notifyAllObservers() {
for (Observer observer : observers) {
observer.update(this.orderStatus);
}
}
}
// 观察者接口(订阅者)
interface Observer {
void update(String status);
}
// 具体观察者:买家
class Buyer implements Observer {
@Override
public void update(String status) {
System.out.println("【买家】收到通知:订单状态变为 -> " + status);
}
}
// 具体观察者:物流
class Logistics implements Observer {
@Override
public void update(String status) {
System.out.println("【物流】收到通知:订单状态变为 -> " + status + ",准备调度!");
}
}
// 使用
public class ObserverDemo {
public static void main(String[] args) {
OrderSubject order = new OrderSubject();
order.attach(new Buyer()); // 买家订阅
order.attach(new Logistics()); // 物流订阅
order.setStatus("已付款"); // 状态改变,自动通知所有订阅方!
order.setStatus("已发货"); // 再次改变,再次通知!
}
}
精髓: 主题维护观察者列表,状态变化时遍历调用观察者的更新方法。观察者主动注册到主题。
优势: 解耦主题与观察者、支持动态订阅、事件驱动灵活。
为什么说设计模式是程序员的必修内功?
- 高内聚低耦合: 模块各司其职,改动一处不炸全局。
- 代码复用王: 优秀设计本身就是可复用的模板。
- 应对变化强: 需求再变,也有优雅的扩展姿势。
- 团队协作顺: 通用“黑话”,沟通效率倍增。
- 代码颜值担当: 告别“面条代码”,写出艺术品!
爆款总结: Java设计模式不是枷锁,而是应对复杂性的超级杠杆。掌握核心的十几种模式(单例、工厂、适配器、观察者、策略、装饰器...),你的代码将脱胎换骨,成为同事眼中的“扫地僧”!别再硬怼需求了,修炼你的设计模式内功,让代码优雅起飞吧!
灵魂拷问: 你还在用if-else打天下吗?下次需求变更时,是选择熬夜重构,还是优雅扩展?设计模式,早学早香!立即行动,开启你的设计模式修炼之旅!
猜你喜欢
- 2025-08-06 JavaBean、MVC设计模式与Java中Dao、Service、Controll三层体系
- 2025-08-06 Java中的责任链设计模式,太牛了
- 2025-08-06 Java设计模式之代理模式
- 2025-08-06 Java/Go/Python/JS不同语言实现23种经典设计模式
- 2025-08-06 Java设计模式之工厂方法模式
- 2025-08-06 Java 后端开发必看!工厂设计模式轻松拿捏
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)