UML 的工厂方法设计模式 策略设计模式 抽象工厂设计模式 观察者设计模式

UML 的工厂方法设计模式

UML 的工厂方法设计模式是一种创建型设计模式,它通过定义一个创建对象的接口,但将具体的对象创建延迟到子类中。这样可以让子类决定实例化哪个类。该模式提供了一种创建对象的灵活方式,同时也隐藏了对象的具体实现细节。

下面通过一个示例来说明工厂方法模式的应用。

假设我们正在开发一个游戏,需要创建不同类型的角色,包括战士、法师和射手。我们可以使用工厂方法模式来创建这些角色对象。

首先,定义一个抽象的角色类 Character,其中包含一个抽象的方法 attack()

public abstract class Character {
    public abstract void attack();
}

然后,定义具体的角色类,继承自抽象角色类,并实现 attack() 方法:

public class Warrior extends Character {
    @Override
    public void attack() {
        System.out.println("Warrior attacks with a sword!");
    }
}

public class Mage extends Character {
    @Override
    public void attack() {
        System.out.println("Mage attacks with magic spells!");
    }
}

public class Archer extends Character {
    @Override
    public void attack() {
        System.out.println("Archer attacks with a bow and arrows!");
    }
}

接下来,定义一个抽象的角色工厂类 CharacterFactory,其中包含一个抽象的工厂方法 createCharacter()

public abstract class CharacterFactory {
    public abstract Character createCharacter();
}

然后,定义具体的角色工厂类,继承自抽象角色工厂类,并实现 createCharacter() 方法来创建具体的角色对象:

public class WarriorFactory extends CharacterFactory {
    @Override
    public Character createCharacter() {
        return new Warrior();
    }
}

public class MageFactory extends CharacterFactory {
    @Override
    public Character createCharacter() {
        return new Mage();
    }
}

public class ArcherFactory extends CharacterFactory {
    @Override
    public Character createCharacter() {
        return new Archer();
    }
}

最后,客户端代码可以通过调用工厂方法来创建不同类型的角色对象:

public class Client {
    public static void main(String[] args) {
        CharacterFactory warriorFactory = new WarriorFactory();
        Character warrior = warriorFactory.createCharacter();
        warrior.attack();

        CharacterFactory mageFactory = new MageFactory();
        Character mage = mageFactory.createCharacter();
        mage.attack();

        CharacterFactory archerFactory = new ArcherFactory();
        Character archer = archerFactory.createCharacter();
        archer.attack();
    }
}

这样,客户端只需要通过调用工厂方法来获取角色对象,并调用其方法来进行相应的操作,而无需关心具体的角色创建细节。

UML的策略设计模式

策略设计模式是一种行为型设计模式,它定义了一系列算法或行为,将每个算法或行为封装在独立的类中,并使它们可以互相替换。通过使用策略模式,客户端可以在运行时选择不同的策略来完成相同的任务,而不需要更改客户端的代码。

策略模式通过将不同行为封装成独立的策略类,每个策略类实现一个共同的接口或抽象类。然后在客户端代码中,通过选择具体的策略对象来改变对象的行为。

下面通过一个示例来说明策略模式的应用。

假设我们正在开发一个电商平台,需要根据不同地区的运输方式计算订单的运费。我们可以使用策略模式来实现不同的运费计算策略。

首先,定义一个抽象的运费计算策略接口 ShippingStrategy

public interface ShippingStrategy {
    double calculate(double originalPrice);
}

然后,定义具体的运费计算策略类,实现 ShippingStrategy 接口:

public class StandardShippingStrategy implements ShippingStrategy {
    @Override
    public double calculate(double originalPrice) {
        // 标准运输方式的运费计算逻辑
        return originalPrice * 0.1;
    }
}

public class ExpressShippingStrategy implements ShippingStrategy {
    @Override
    public double calculate(double originalPrice) {
        // 快递运输方式的运费计算逻辑
        return originalPrice * 0.2;
    }
}

public class FreeShippingStrategy implements ShippingStrategy {
    @Override
    public double calculate(double originalPrice) {
        // 免运费运输方式的运费计算逻辑
        return 0.0;
    }
}

接下来,定义一个电商订单类 Order,其中包含一个运费计算策略对象和一个计算运费的方法:

public class Order {
    private ShippingStrategy shippingStrategy;

    public Order(ShippingStrategy shippingStrategy) {
        this.shippingStrategy = shippingStrategy;
    }

    public double calculateShippingFee(double originalPrice) {
        return shippingStrategy.calculate(originalPrice);
    }
}

最后,在客户端代码中,根据需要选择具体的运费计算策略进行计算:

public class Client {
    public static void main(String[] args) {
        ShippingStrategy standardShippingStrategy = new StandardShippingStrategy();
        Order order1 = new Order(standardShippingStrategy);
        double fee1 = order1.calculateShippingFee(100.0);
        System.out.println("Standard shipping fee: " + fee1);

        ShippingStrategy expressShippingStrategy = new ExpressShippingStrategy();
        Order order2 = new Order(expressShippingStrategy);
        double fee2 = order2.calculateShippingFee(100.0);
        System.out.println("Express shipping fee: " + fee2);

        ShippingStrategy freeShippingStrategy = new FreeShippingStrategy();
        Order order3 = new Order(freeShippingStrategy);
        double fee3 = order3.calculateShippingFee(100.0);
        System.out.println("Free shipping fee: " + fee3);
    }
}

这样,客户端可以根据需要选择不同的运费计算策略,并通过订单对象的方法进行运费计算。

UML的抽象工厂设计模式

抽象工厂设计模式是一种创建型设计模式,它提供了一种创建一系列相关或依赖对象的接口,而无需指定具体类。它主要解决的问题是如何创建一组具有共同特征的对象。

抽象工厂模式通过引入抽象工厂接口和具体工厂实现类,以及一系列相关的产品接口和具体产品实现类,来实现对象的创建。

下面通过一个示例来说明抽象工厂模式的应用。

假设我们正在开发一个跨平台的图形界面库,需要支持 Windows 和 Mac 两个操作系统的界面风格。我们可以使用抽象工厂模式来实现不同操作系统下的界面组件的创建。

首先,定义抽象的界面组件接口 ButtonTextbox

public interface Button {
    void render();
}

public interface Textbox {
    void render();
}

然后,在每个操作系统下,定义具体的界面组件实现类:

// Windows操作系统下的界面组件实现类
public class WindowsButton implements Button {
    @Override
    public void render() {
        // Windows风格的按钮渲染逻辑
        System.out.println("Rendering Windows button...");
    }
}

public class WindowsTextbox implements Textbox {
    @Override
    public void render() {
        // Windows风格的文本框渲染逻辑
        System.out.println("Rendering Windows textbox...");
    }
}

// Mac操作系统下的界面组件实现类
public class MacButton implements Button {
    @Override
    public void render() {
        // Mac风格的按钮渲染逻辑
        System.out.println("Rendering Mac button...");
    }
}

public class MacTextbox implements Textbox {
    @Override
    public void render() {
        // Mac风格的文本框渲染逻辑
        System.out.println("Rendering Mac textbox...");
    }
}

接下来,定义抽象工厂接口 GUIFactory,其中包含创建按钮和文本框的方法:

public interface GUIFactory {
    Button createButton();
    Textbox createTextbox();
}

然后,在每个操作系统下,定义具体的工厂实现类,分别实现 GUIFactory 接口:

// Windows操作系统下的界面组件工厂
public class WindowsGUIFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }

    @Override
    public Textbox createTextbox() {
        return new WindowsTextbox();
    }
}

// Mac操作系统下的界面组件工厂
public class MacGUIFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }

    @Override
    public Textbox createTextbox() {
        return new MacTextbox();
    }
}

最后,在客户端代码中,根据当前操作系统选择合适的工厂,并使用工厂创建界面组件:

public class Client {
    public static void main(String[] args) {
        // 根据操作系统选择合适的工厂
        GUIFactory factory;
        if (isWindows()) {
            factory = new WindowsGUIFactory();
        } else {
            factory = new MacGUIFactory();
        }

        // 使用工厂创建界面组件
        Button button = factory.createButton();
        Textbox textbox = factory.createTextbox();

        // 使用界面组件
        button.render();
        textbox.render();
    }

    private static boolean isWindows() {
        // 判断当前操作系统是否为Windows
        // ...
        return true;
    }
}

这样,通过选择合适的工厂,可以在不同的操作系统下创建对应的界面组件,并使用这些界面组件进行开发。

UML的观察者设计模式

观察者设计模式是一种行为型设计模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。

在观察者模式中,有两个关键角色:观察者(Observer)和被观察者(Subject)。观察者订阅被观察者,当被观察者状态发生变化时,观察者会收到通知并执行相应的操作。

下面通过一个示例来说明观察者模式的应用。

假设有一个电子商务网站,当某个商品降价时,网站上的用户应该能够自动收到相关的通知。

首先,定义观察者接口 Observer,其中包含一个更新通知的方法:

public interface Observer {
    void update(String message);
}

然后,定义被观察者类 Product,其中包含订阅、取消订阅和通知观察者的方法:

import java.util.ArrayList;
import java.util.List;

public class Product {
    private List<Observer> observers = new ArrayList<>();
    private String name;
    private double price;

    public Product(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void detach(Observer observer) {
        observers.remove(observer);
    }

    public void setPrice(double price) {
        if (this.price != price) {
            this.price = price;
            notifyObservers();
        }
    }

    private void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(name + " 的价格已经改变为 " + price);
        }
    }
}

接下来,定义观察者类 User,该类实现了 Observer 接口,当收到通知时会打印相关信息:

public class User implements Observer {
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println(name + " 收到通知:" + message);
    }
}

最后,在客户端代码中,创建被观察者对象和观察者对象,并建立订阅关系:

public class Client {
    public static void main(String[] args) {
        // 创建被观察者对象
        Product product = new Product("手机", 2000.0);

        // 创建观察者对象
        Observer user1 = new User("张三");
        Observer user2 = new User("李四");

        // 建立订阅关系
        product.attach(user1);
        product.attach(user2);

        // 改变被观察者状态,触发通知

这些设计模式在软件开发中都有广泛的应用,可以提供灵活的解决方案来实现各种需求。在使用它们时需要根据实际情况选择最合适的设计模式,并根据设计原则和模式的特性来进行设计和实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/581150.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp微信小程序开发踩坑日记:由于图表数据渲染不出来,我第一次在项目中用watch函数监听数据变化

一、发现问题 在我们团队自己开发的微信小程序中&#xff0c;引入了Echarts图表库 然后突然有一天&#xff0c;后端队友反应图表渲染有问题。后面我去试了一下&#xff0c;确实20次里面必有一次数据渲染不出来 断定代码没问题&#xff0c;于是我们将其鉴定为玄学 二、问题原因…

【GitHub】主页简历优化

【github主页】优化简历 写在最前面一、新建秘密仓库二、插件卡片配置1、仓库状态统计2、Most used languages&#xff08;GitHub 常用语言统计&#xff09;使用细则 3、Visitor Badge&#xff08;GitHub 访客徽章&#xff09;4、社交统计5、打字特效6、省略展示小猫 &#x1f…

UDP和TCP(传输层)

这里写目录标题 UDPUDP的基本特点UDP协议报文格式 TCPTCP协议报文格式TCP特点可靠传输实现机制确认应答超时重传数据丢了应答报文丢了 小结 UDP UDP的基本特点 无连接不可靠传输面向数据报全双工 UDP协议报文格式 2个字节有效范围(无符号): 0 ~ 65535(2^16 - 1). 2个字节有效范…

用数据检验函数正确性,matlab2C

数据存取格式 filename1 g.txt; fid1 fopen(filename1,w); for i 1 : length(g)for j1:size(g,2)if(j1)fprintf(fid1,{%.16f,,g(i,j)); elseif(j>1&&j<151)fprintf(fid1,%.16f,,g(i,j)); elsefprintf(fid1,%.16f},\n,g(i,j));endend%fprintf(fid1,\n…

如何用Python语言实现远程控制4路控制器/断路器

如何用Python语言实现远程控制4路控制器/断路器呢&#xff1f; 本文描述了使用Python语言调用HTTP接口&#xff0c;实现控制4路控制器/断路器&#xff0c;支持4路输出&#xff0c;均可独立控制&#xff0c;可接入各种电器。 可选用产品&#xff1a;可根据实际场景需求&#xf…

Spring Web MVC入门(3)——响应

目录 一、返回静态页面 RestController 和 Controller之间的关联和区别 二、返回数据ResponseBody ResponseBody作用在类和方法的情况 三、返回HTML代码片段 响应中的Content-Type常见的取值&#xff1a; 四、返回JSON 五、设置状态码 六、设置Header 1、设置Content…

2024李卜常识开天斧

2024年&#xff0c;李卜常识开天斧课程以其独特的魅力吸引了众多学子。这门课程如同开天辟地的神斧&#xff0c;帮助我们打开常识知识的大门&#xff0c;引领我们走进一个全新的学习世界。在李卜老师的悉心指导下&#xff0c;我们逐渐掌握了各种常识知识&#xff0c;拓宽了视野…

leaftjs+turfjs+idw纯前端实现等值面绘图+九段线

最近有个绘制等值面图的需求。我们一般的实现路径是&#xff1a; 1.后台绘图&#xff0c;用surfer绘制好&#xff0c;给前端调用叠加到地图。 2.后台用python绘图&#xff0c;绘制好给前端调用&#xff0c;叠加到地图。 3.后台进行插值计算、地图裁剪、最终生成geojson文件或…

VS2019配合QT5.9开发IRayAT430相机SDK

环境配置 VS2019 QT5.9 编译器版本 MSVC2017_64添加系统环境变量&#xff08;完毕后重启电脑&#xff09; 从VS2019中下载Qt插件 从VS2019中添加单个编译组件 上述操作完成后用VS打开工程文件&#xff0c;工程文件地址 &#xff1a; C:\Users\86173\Desktop\IRCNETSDK_W…

初识 Linux

一、基础命令 0、 ls cd cat pwd 当前工作目录 find -name 测试.py 查找文件 grep "学院" 测试.py 查找字符串 "学院" 在文件 测试.py 中位置&#xff0c;输出所在的 行 1、重定向器 echo "Hello Kali Linux!" > Hello 创建 文件 Hel…

openssl3.2 - exp - 使用默认的函数宏,在release版中也会引入__FILE__

文章目录 openssl3.2 - exp - 使用默认的函数宏&#xff0c;在release版中也会引入__FILE__概述笔记验证是否__FILE__在release版下也能用&#xff1f;将openssl编译成release版的&#xff0c;看看CRYPTO_free()是否只需要一个参数就行&#xff1f;将工程中的openssl相关的库换…

stream中的foreach,allMatch,noneMatch,anyMatch的基本使用

1.1foreach遍历集合元素 1.2anyMatch()的使用 结论:上边使用foreach循环遍历和使用anyMatch()的作用相同 2.allMatch() 2.1初级使用 2.2进级使用 3.noneMatch()使用

Python 实现视频去抖动技术

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 视频去抖动是视频处理中的一项重要技术&#xff0c;它可以有效地减少视频中由于相机震动或手…

华为matebook 14安装ubuntu双系统

一、准备u盘 首先格式化u盘(选择FAT32) 二、确认电脑类型 键盘按下win+r(win:开始键/也就是Windows的标志那个键),在输入框内输入msinfo32后,回车确认 确定自己电脑 硬盘 的类型: 在显示屏下方的搜索框内搜索“计算机管理” 点击进入后,再点击左边列表内的“磁…

拉普拉斯IPO:荣获国家级专精特新和国家级制造业单项冠军殊荣

近期&#xff0c;拉普拉斯荣获国家级专精特新和国家级制造业单项冠军的殊荣&#xff0c;这无疑是对其在技术和发展方面的肯定。这些荣誉证明了拉普拉斯在光伏行业的卓越表现和持续创新&#xff0c;以及其在国内制造业中的领先地位&#xff0c;进一步彰显了拉普拉斯在技术研发和…

智慧浪潮下的产业园区:洞察智慧化转型如何打造高效、绿色、安全的新园区

目录 一、引言 二、智慧化转型的内涵与价值 三、打造高效园区的智慧化策略 1、建设智能化基础设施 2、推广智能化应用 3、构建智慧化服务平台 四、实现绿色园区的智慧化途径 1、推动绿色能源应用 2、实施绿色建筑设计 3、加强环境监测与治理 五、保障园区安全的智慧…

【办公类-22-14】周计划系列(5-6)“周计划-06 19周的周计划教案合并打印PDF(最终打印版))

背景需求&#xff1a; 花了十周&#xff0c;终于把周计划教案的文字都写满、加粗、节日替换了。为了便于打印&#xff0c;我把19周的周计划教案全部合并在一起PDF。制作打印用PDF 思路 1、周计划是单独打印一张&#xff0c;因此要在第2页插入空白页&#xff0c; 2、教案有3页…

[计算机效率] 截图工具:FastStone Capture

3.19 截图工具&#xff1a;FastStone Capture FastStone Capture是一款功能强大的屏幕捕捉软件&#xff0c;体积小巧、功能强大&#xff0c;不但具有常规截图等功能&#xff0c;更有从扫描器获取图像&#xff0c;和将图像转换为PDF文档等功能。 截屏功能&#xff1a;支持全屏截…

【Python数据库】MongoDB

文章目录 [toc]数据插入数据查询数据更新数据删除 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python数据库 学习指南&#xff1a;Python学习指南 数据插入 from pymongo import MongoClientdef insert_data():mongo_client MongoClient(hostlocalhost, port27017)co…

Git变更账户、查看账户

1、变更账户 &#xff08;1&#xff09;修改当前文件夹用户 git config user.name “新用户名” git config user.email “新邮箱” &#xff08;2&#xff09;修改全局git用户 git config - -global user.name “新用户名” git config - -global user.email “新邮箱”…
最新文章