首页 > 其他分享 >设计模式之行为型模式

设计模式之行为型模式

时间:2024-07-20 09:54:17浏览次数:17  
标签:方法 void 模式 class 命令 设计模式 行为 public

行为型模式关注流程控制。

行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象无法完成的任务,涉及算法与对象间职责的分配。

  • 类行为模式:采用继承机制来在类间分派行为

  • 对象行为模式:采用组合或聚合在对象间分配行为

行为模式包括 11 种:模板方法模式、解释器模式、策略模式、命令模式、职责链模式、状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式。仅前两种属于类行为模式。

模板方法模式

算法步骤以及步骤的执行顺序清晰,某些步骤依赖具体环境,这些步骤仅在父类声明,实现推迟到子类。

模板方法(Template Method)的角色:

  • 抽象类(Abstract Class):由一个模板方法和若干个基本方法构成。

    模板方法定义算法骨架,基本方法实现算法各个步骤,是模板方法的组成部分。基本方法又可以分为三种:抽象方法(Abstract Method) 、具体方法(Concrete Method) 、钩子方法(Hook Method) 。

  • 具体子类(Concrete Class):继承抽象类并实现抽象方法和钩子方法。

模板方法模式提高代码复用性,实现了反向控制。

适用场景:算法清晰,部分步骤易变;父类部分操作依赖于子类判断。

实现方式
// 抽象父类
public abstract class AbstractCook {
   

    /**
     * 模板方法
     * 算法步骤固定,使用final修饰,不允许改变
     */
    public final void cook() {
   
        // 1.放蔬菜
        addVegetable();
        // 2.放调料
        addDressing();
        // 3.翻炒
        stirFry();
    }

    public void addVegetable() {
   }

    // 抽象方法
    public abstract void addDressing();

    public void stirFry() {
   }
}
// 具体子类
public class TomatoCook extends AbstractCook {
   
    @Override
    public void addVegetable() {
   
        System.out.println("tomato");
    }

    @Override
    public void addDressing() {
   
        System.out.println("salt");
    }
}
// 使用者
TomatoCook ck = new TomatoCook();
ck.cook();
源码寻迹

InputStream 类的无参 read() 方法是抽象的,由子类实现,有参 read() 方法通过无参 read() 方法实现。

public abstract class InputStream{
   
    // read()推迟到子类实现
    public abstract int read();
    // 模板方法
	public int read(byte b[], int off, int len){
   
        Objects.checkFromIndexSize(off, len, b.length);
        if (len == 0) {
   
            return 0;
        }
        // this↓
        int c = read();
        if (c == -1) {
   
            return -1;
        }
        b[off] = (byte)c;
        int i = 1;
        try {
   
            for (; i < len ; i++) {
   
                // this↓
                c = read();
                if (c == -1) {
   
                    break;
                }
                b[off + i] = (byte)c;
            }
        } catch (IOException ee) {
   
        }
        return i;
    }
}

策略模式

多种可相互替代的策略/算法。

策略模式(Strategy)的角色:

  • 抽象策略类(Strategy):给出所有具体策略类所需的接口。
  • 具体策略类(Concrete Strategy):实现抽象策略,提供具体的算法实现。
  • 环境类(Context):持有策略类的引用,供使用者调用。

策略模式避免使用多重条件选择语句,策略类之间可以自由切换,可结合享元模式减少策略类的创建。

适用场景:存在多个可相互独立、相互替换的算法。

实现方式
// 抽象策略
public interface Strategy {
   
    void show();
}
// 具体策略
public class SA implements Strategy {
   
    @Override
    public void show() {
   
        System.out.println("A");
    }
}
public class SB implements Strategy {
   
    @Override
    public void show() {
   
        System.out.println("B");
    }
}
// 环境
public class Context {
   

    // 持有策略类
    private Strategy strategy;

    public Context(Strategy strategy) {
   
        this.strategy = strategy;
    }

    // 调用具体策略算法
    public void show() {
   
        strategy.show();
    }

}
// 使用者
Context context = new Context(new Strategy());
context.show();
源码寻迹

Arrays 是环境类,其 sort() 方法可根据传入的策略进行排序操作。

public class Arrays {
   
	public static <T> void sort(T[] a, Comparator<? super T> c) {
   
        if (c == null) {
   
            sort(a);
        } else {
   
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }
}

命令模式

将请求封装为命令对象,发起请求方与执行请求方通过命令对象沟通。

命令模式(Command)的角色

  • 抽象命令类(Command):声明执行方法。
  • 具体命令(Concrete Command):实现命令接口,通常持有接收者,并调用接收者来完成命令。
  • 接收者(Receiver): 执行命令。
  • 请求者(Invoker):命令对象执行请求,通常持有命令对象,使用命令对象的入口。

请求者持有命令,命令持有接收者。

命令模式将调用操作的对象与实现该操作的对象解耦,可以实现宏命令,方便实现 Undo 和 Redo 操作。

适用场景:调用者和接收者解耦,不直接交互;支持命令的撤销(Undo)操作和恢复(Redo)操作。

实现方式
// 接收者
public class Chef {
   
    public void cook(String name) {
   
        System.out.println("cook " + name);
    }
}
// 抽象命令
public interface Command {
   
    void execute();
}
// 具体命令
public class OrderCommand implements Command {
   

    // 持有接收者
    private Chef chef;
    // 持有订单
    private Order order;

    public OrderCommand(Chef chef, Order order) {
   
        this.chef = chef;
        this.order = order;
    }

    @Override
    public void execute() {
   
        order.getNameList().forEach(name-> chef.cook(name));
    }

}
// 订单
public class Order {
   
    // 订单中的菜品
    private List<String> nameList;
}
// 请求者
public class Waiter {
   

    // 持有命令
    private List<Command> commandList = new ArrayList<>();

    public void addCommand(Command cmd) {
   
        commandList.add(cmd);
    }

    // 发起请求
    public void order() {
   
        commandList.forEach(Command::execute);
    }

}
// 使用者
Chef cf = new Chef();<

标签:方法,void,模式,class,命令,设计模式,行为,public
From: https://blog.csdn.net/qq_53469830/article/details/140186978

相关文章

  • lvs的nat和dr模式混合用
     lvs:10.0.0.200 vip 10.0.0.19外网IP,172.168.1.19内网IP drrs:10.0.0.200vip 10.0.0.18rip  natrs:172.168.1.17rip 客户端:10.0.0.14cip lvs机器: ipaddradd10.0.0.200/24devens33:0 IP:[root@mcw09~]#ipa1:lo:<LOOPBACK,UP,......
  • 攻防世界Web_python_template_injection(新手模式)
    二、Web_python_template_injection1.基本知识点模版引擎模版引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,这大大提升了开发效率,良好的设计也使得代码重用变得更加容易,但是模板引擎也拓宽了我们的攻击面,注入到模板中的代码可能会引发RCE或者XSS。在Jinja2......
  • 第4章.消费者领域中的模式实现
            我们在前几章中学习了重要的建筑模式;本章介绍了与消费者领域相关的这些模式的用例。尽管消费者领域存在许多用例(电子健康、老年护理、宠物追踪、能源管理、安全保障、机器人吸尘器等),但本章仅详细介绍两个用例——家庭自动化和智能煮蛋器——以透视实施消费者物......
  • 攻防世界web2(新手模式)
    一、web21.基本知识点strrev():反转字符串str_rot13():用于字符串加密和解密的函数,它实现了ROT13算法。ROT13(rotateby13places)是一种简单的字母替换加密算法,它将字母表中的每个字母替换为其后第13个字母。由于字母表有26个字母,所以再次应用ROT13会恢复原始字符串,因此它......
  • C# 使用模式匹配的好处,因为好用所以推荐~
    C#使用模式匹配的好处,因为好用所以推荐~ 类型检查和转换:当你需要检查对象是否为特定类型,并且希望在同一时间内将其转换为那个类型时,模式匹配提供了一种更简洁的方式来完成这一任务,避免了使用传统的as和is操作符后还需要进行额外的null检查。复杂条件逻辑:在处理复杂的条......
  • 单例设计模式
    单例设计模式:设计模式:​一个问题通常有n种解法,其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。​设计模式有23种,对应23种软件开发中会遇到的经典问题。单例设计模式:确保一个类只有一个对象。  饿汉式单例:饿汉式单例:拿对象时,对象......
  • 模板方法设计模式
    模板方法设计模式:模板方法设计模式:解决方法中存在重复代码的问题。  模板方法设计模式的写法:1、定义一个抽象类2、在里面定义2个方法​一个是模板方法:把相同代码放里面去​一个是抽象方法:具体实现交给子类完成建议使用final关键字修饰模板方法:​模板方......
  • C# 使用is模式匹配
    类型检查和转换:当你需要检查对象是否为特定类型,并且希望在同一时间内将其转换为那个类型时,模式匹配提供了一种更简洁的方式来完成这一任务,避免了使用传统的as和is操作符后还需要进行额外的null检查。复杂条件逻辑:在处理复杂的条件逻辑时,特别是涉及到多个条件和类型的情况下,使......
  • 设计模式
    总的总结策略模式:注入接口观察者模式:事件与监听器责任链模式:方法三抽象类代理模式:aop适配器模式单例模式建造者模式@Builder工厂模式......
  • C# 模式匹配
    C#使用模式匹配的好处,因为好用所以推荐~-万雅虎-博客园(cnblogs.com) 具体可以看这篇文章我主要是写一下自己的看法1.Object类型转换以往的Object类型转换都是比较麻烦的,比如objectobj="20";varnum=(int)obj;Console.......