女生学网站设计东莞最新防控通知

张小明 2026/1/9 21:00:32
女生学网站设计,东莞最新防控通知,南京做电商网站的公司简介,苏州建设网站微信公众号各位道友#xff0c;贫道吕洞宾又来给大家讲Java设计模式啦#xff01;今天咱们不炼丹#xff0c;改讲接口变形术、“代码翻译官”、“消息小灵通和多重分身术”#xff01;准备好你的Java飞剑#xff0c;咱们开始吧#xff01; #x1f504; 改…各位道友贫道吕洞宾又来给大家讲Java设计模式啦今天咱们不炼丹改讲接口变形术、“代码翻译官”、“消息小灵通和多重分身术”准备好你的Java飞剑咱们开始吧 改变接口给代码整容的艺术有时候啊咱们的代码就像相亲一样——你看上的对象接口不对怎么办总不能重新投胎吧这时候就需要改变接口的设计模式来帮忙了1. 适配器模式代码界的转接头适配器模式就像给你的旧手机配个Type-C转接头让新充电器也能用特征将一个类的接口转换成客户端期望的另一个接口让原本不兼容的类可以一起工作就像翻译官让说不同语言的对象能沟通代码示例// 旧接口 - 就像老式圆孔耳机插口 interface OldPlayer { void playMp3(String fileName); } // 新接口 - 新式Type-C接口 interface NewPlayer { void playAudio(String file); } // 旧实现类 class OldMp3Player implements OldPlayer { public void playMp3(String fileName) { System.out.println(播放MP3: fileName); } } // 适配器 - 转接头来了 class PlayerAdapter implements NewPlayer { private OldPlayer oldPlayer; PlayerAdapter(OldPlayer oldPlayer) { this.oldPlayer oldPlayer; } public void playAudio(String file) { // 把新接口调用转成旧接口调用 oldPlayer.playMp3(file); } } // 使用 NewPlayer player new PlayerAdapter(new OldMp3Player()); player.playAudio(song.mp3); // 成功播放反例分析如果不用适配器代码会变成这样// 糟糕的写法 - 直接修改客户端代码 class Client { void playMusic(OldPlayer player) { // 需要知道旧接口的细节 if (player instanceof OldMp3Player) { ((OldMp3Player)player).playMp3(song.mp3); } // 每新增一种播放器就要修改这里 } }问题客户端需要知道具体实现类的细节违反开闭原则每次新增类型都要修改客户端代码耦合度高难以维护优点让不兼容的接口能够协同工作提高代码复用性符合开闭原则缺点增加系统复杂度过多使用会让系统变得混乱2. 外观模式代码界的前台小姐姐外观模式就像公司前台你不需要知道公司内部有多少部门找前台小姐姐就行特征为复杂的子系统提供一个统一的接口隐藏系统的复杂性客户端只需要和外观类交互代码示例// 复杂的子系统 - 就像公司各个部门 class CPU { void start() { System.out.println(CPU启动); } void execute() { System.out.println(CPU执行指令); } } class Memory { void load() { System.out.println(内存加载); } } class HardDisk { void read() { System.out.println(硬盘读取); } } // 外观类 - 公司前台 class ComputerFacade { private CPU cpu; private Memory memory; private HardDisk hardDisk; ComputerFacade() { this.cpu new CPU(); this.memory new Memory(); this.hardDisk new HardDisk(); } // 统一接口 - 开机按钮 void startComputer() { System.out.println( 电脑开机 ); hardDisk.read(); memory.load(); cpu.start(); cpu.execute(); System.out.println( 开机完成 ); } } // 使用 ComputerFacade computer new ComputerFacade(); computer.startComputer(); // 一键开机多简单反例分析如果不用外观模式// 糟糕的写法 - 客户端需要了解所有细节 class Client { void startComputer() { CPU cpu new CPU(); Memory memory new Memory(); HardDisk hardDisk new HardDisk(); // 需要知道正确的启动顺序 hardDisk.read(); memory.load(); cpu.start(); cpu.execute(); // 如果顺序错了电脑就开不了机 } }问题客户端需要了解子系统所有细节客户端与子系统高度耦合修改子系统会影响所有客户端优点简化客户端使用降低系统耦合度提高子系统独立性缺点不符合开闭原则新增功能可能需要修改外观可能变成上帝类什么都管 解释器模式代码界的翻译官解释器模式就像给你配了个随身翻译你说我要喝咖啡翻译官帮你转换成机器能懂的指令特征定义语言的文法规则构建解释器来解释语言中的句子适用于需要解释执行的语言代码示例// 抽象表达式 interface Expression { int interpret(Context context); } // 终结符表达式 - 数字 class NumberExpression implements Expression { private int number; NumberExpression(int number) { this.number number; } public int interpret(Context context) { return number; } } // 非终结符表达式 - 加法 class AddExpression implements Expression { private Expression left; private Expression right; AddExpression(Expression left, Expression right) { this.left left; this.right right; } public int interpret(Context context) { return left.interpret(context) right.interpret(context); } } // 上下文 class Context { // 可以存储变量等信息 } // 使用 Expression expression new AddExpression( new NumberExpression(10), new AddExpression( new NumberExpression(5), new NumberExpression(3) ) ); int result expression.interpret(new Context()); System.out.println(10 (5 3) result); // 输出: 18反例分析如果不用解释器模式// 糟糕的写法 - 硬编码解析逻辑 class Calculator { int calculate(String expression) { // 需要自己解析字符串 if (expression.contains()) { String[] parts expression.split(\\); // 还要处理嵌套括号、优先级等 // 代码会非常复杂 } return 0; } }问题解析逻辑与业务逻辑混在一起难以扩展新的语法规则代码复杂难以维护优点容易扩展新的语法规则实现简单语法很容易符合单一职责原则缺点复杂文法难以维护执行效率较低类数量会很多 回调模式代码界的消息小灵通回调模式就像你给朋友留个电话有事打我电话朋友有事就call你。观察者模式订阅-发布系统观察者模式就像微信公众号你关注了公众号一更新你就收到推送特征定义对象间的一对多依赖关系当一个对象状态改变时所有依赖它的对象都得到通知也叫发布-订阅模式代码示例// 观察者接口 interface Observer { void update(String message); } // 主题接口 interface Subject { void attach(Observer observer); void detach(Observer observer); void notifyObservers(); } // 具体主题 - 微信公众号 class WeChatPublicAccount implements Subject { private ListObserver observers new ArrayList(); private String latestArticle; public void attach(Observer observer) { observers.add(observer); } public void detach(Observer observer) { observers.remove(observer); } public void notifyObservers() { for (Observer observer : observers) { observer.update(latestArticle); } } // 发布新文章 void publishArticle(String article) { this.latestArticle article; System.out.println(公众号发布了新文章: article); notifyObservers(); } } // 具体观察者 - 用户 class User implements Observer { private String name; User(String name) { this.name name; } public void update(String message) { System.out.println(name 收到推送: message); } } // 使用 WeChatPublicAccount account new WeChatPublicAccount(); User user1 new User(张三); User user2 new User(李四); account.attach(user1); account.attach(user2); account.publishArticle(Java设计模式详解); // 输出: // 公众号发布了新文章: Java设计模式详解 // 张三 收到推送: Java设计模式详解 // 李四 收到推送: Java设计模式详解反例分析如果不用观察者模式// 糟糕的写法 - 主题直接调用所有观察者 class BadPublicAccount { private ListUser users new ArrayList(); void addUser(User user) { users.add(user); } void publishArticle(String article) { System.out.println(发布文章: article); // 需要知道User的具体实现 for (User user : users) { user.receiveArticle(article); // 方法名硬编码 } } } class User { void receiveArticle(String article) { // 只能接收文章不能接收其他类型消息 } }问题主题与观察者紧耦合难以扩展新的观察者类型违反开闭原则优点降低耦合度支持广播通信符合开闭原则缺点观察者过多时通知开销大可能引起循环引用 多路分发代码界的多重分身术多路分发就像你同时跟好几个人聊天根据对方是谁和聊什么内容给出不同的回复。特征根据多个对象的实际类型决定调用哪个方法Java本身只支持单分发根据接收者类型通过设计模式实现多分发代码示例// 游戏角色接口 interface Character { String fight(Character opponent); String fightAgainst(Knight knight); String fightAgainst(Wizard wizard); String fightAgainst(Dragon dragon); } // 具体角色 class Knight implements Character { public String fight(Character opponent) { return opponent.fightAgainst(this); } public String fightAgainst(Knight knight) { return 骑士 vs 骑士: 决斗开始; } public String fightAgainst(Wizard wizard) { return 骑士 vs 法师: 冲锋; } public String fightAgainst(Dragon dragon) { return 骑士 vs 龙: 屠龙勇士; } } class Wizard implements Character { public String fight(Character opponent) { return opponent.fightAgainst(this); } public String fightAgainst(Knight knight) { return 法师 vs 骑士: 火球术; } public String fightAgainst(Wizard wizard) { return 法师 vs 法师: 魔法对决; } public String fightAgainst(Dragon dragon) { return 法师 vs 龙: 召唤元素; } } class Dragon implements Character { public String fight(Character opponent) { return opponent.fightAgainst(this); } public String fightAgainst(Knight knight) { return 龙 vs 骑士: 喷火; } public String fightAgainst(Wizard wizard) { return 龙 vs 法师: 魔法抗性; } public String fightAgainst(Dragon dragon) { return 龙 vs 龙: 同类不相残; } } // 使用 Character knight new Knight(); Character wizard new Wizard(); Character dragon new Dragon(); System.out.println(knight.fight(wizard)); // 骑士 vs 法师 System.out.println(wizard.fight(dragon)); // 法师 vs 龙 System.out.println(dragon.fight(knight)); // 龙 vs 骑士反例分析如果不用多路分发// 糟糕的写法 - 使用大量if-else class BadCharacter { String fight(BadCharacter opponent) { if (this instanceof Knight) { if (opponent instanceof Knight) { return 骑士 vs 骑士; } else if (opponent instanceof Wizard) { return 骑士 vs 法师; } // 每新增一个角色类型这里就要加一个if } else if (this instanceof Wizard) { // 同样需要很多if判断 } return 未知战斗; } }问题代码臃肿大量if-else语句违反开闭原则难以维护和扩展优点消除条件判断易于扩展新类型代码更优雅缺点类数量增多理解成本较高 模式对比总结模式适用场景核心思想优点缺点适配器模式接口不兼容需要协作转换接口复用旧代码解耦增加复杂度外观模式简化复杂子系统统一接口简化使用降低耦合可能违反开闭原则解释器模式需要解释特定语言解释执行易于扩展语法效率低复杂文法难维护观察者模式一对多依赖关系发布-订阅解耦支持广播可能引起循环引用多路分发多类型交互双重虚拟调用消除条件判断类数量多 实战应用建议何时用适配器想使用现有类但接口不匹配时系统需要复用一些类但这些类接口不符合系统需求想创建一个可以复用的类与不相关类协同工作何时用外观为复杂子系统提供简单接口客户端与多个子系统耦合严重时需要分层构建系统时何时用解释器需要解释简单语言时文法规则相对固定时效率要求不高时何时用观察者一个对象状态改变需要通知其他对象需要建立触发链时广播通知场景何时用多路分发多个对象类型需要交互想避免大量if-else判断类型组合爆炸时 组合使用案例// 组合使用多个模式 // 外观 观察者 适配器 // 旧系统接口 interface OldNotificationSystem { void sendSMS(String message); } // 新系统接口 interface NewNotificationSystem { void notify(String message); } // 适配器 class NotificationAdapter implements NewNotificationSystem { private OldNotificationSystem oldSystem; NotificationAdapter(OldNotificationSystem oldSystem) { this.oldSystem oldSystem; } public void notify(String message) { oldSystem.sendSMS(message); } } // 观察者 interface Subscriber { void receive(String message); } // 外观 - 统一的通知中心 class NotificationCenter { private ListSubscriber subscribers new ArrayList(); private NewNotificationSystem notificationSystem; NotificationCenter(NewNotificationSystem system) { this.notificationSystem system; } void subscribe(Subscriber subscriber) { subscribers.add(subscriber); } void broadcast(String message) { // 使用适配后的系统 notificationSystem.notify(message); // 通知所有观察者 for (Subscriber subscriber : subscribers) { subscriber.receive(message); } } }记住设计模式就像武功招式用对了威力无穷用错了就是花拳绣腿。关键是要理解每个模式的适用场景不要为了用模式而用模式好了今天的Java设计模式课就到这里。贫道要去修炼写代码了下次再见记得多练习代码就像内功越练越深厚
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

制作企业网站方案网页制作三剑客是哪三个

IwaraDownloadTool是一款专为Iwara平台设计的高效视频下载工具,能够帮助用户轻松保存喜爱的视频内容。无论你是初次接触还是想要提升下载效率,本教程都将为你提供全面的操作指导。 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader…

张小明 2026/1/9 15:01:18 网站建设

服饰怎么做网站推广wordpress显示代码

Vivado下载不成功?一文搞定Windows平台JTAG驱动配置全流程 你有没有遇到过这样的场景: FPGA逻辑设计终于调通了,仿真波形完美无缺,兴冲冲打开Vivado Hardware Manager准备烧录——结果弹出一句冰冷的提示:“ No har…

张小明 2026/1/9 15:01:17 网站建设

网站外链如何做微信图标wordpress

深入了解Elvis编辑器的强大功能 1. GUI界面按钮与弹窗 在Elvis编辑器的GUI界面中,有一些特殊的按钮和弹窗功能。例如,第三行代码创建了名为“Quit”的按钮,用于退出程序。第四行代码改变了它的行为: - 当条件 (!modified) 为真时,按钮正常工作。 - 当条件为假时,按…

张小明 2026/1/9 15:01:15 网站建设

php大型网站开发书籍天津企业建网站

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个对比演示工具,左侧展示传统解决共享文件夹访问问题的步骤(如手动检查组策略、联系IT部门等),右侧展示使用AI工具的自动化解…

张小明 2026/1/9 15:01:13 网站建设

网站后期的维护和更新如何制作app应用

第一章:Open-AutoGLM 驱动 2026 AI 手机预测随着生成式AI技术的迅猛发展,Open-AutoGLM作为新一代开源多模态大语言模型,正逐步成为AI手机智能化演进的核心驱动力。该模型具备强大的上下文理解、代码生成与设备端推理优化能力,为20…

张小明 2026/1/9 16:18:37 网站建设

做网站打广告网站建设免备案免费空间

提示工程的艺术:如何用精准 Prompt 激活 VibeThinker 的极限推理能力 在大模型纷纷向千亿、万亿参数冲刺的今天,一个仅含15亿参数的小模型却悄然杀出重围——VibeThinker-1.5B-APP。它不擅长闲聊,也不写诗作画,但当你抛出一道Leet…

张小明 2026/1/9 16:18:35 网站建设