行为型设计模式—strategy(策略模式)/command(命令模式)/memento(备忘录模式)/state(状态模式)

本文详细介绍了四种设计模式:策略模式通过接口实现不同逻辑,避免使用ifelse;命令模式将操作封装为命令对象,便于实现撤销功能;备忘录模式用于记录操作历史,方便回退;状态模式通过状态对象实现不同场景下的行为差异。这些设计模式在软件开发中常用于提高代码可维护性和灵活性。
摘要由CSDN通过智能技术生成

一、行为型设计模式的作用

关注点在于类和对象如何协作,各自分担职责。

二、strategy(策略模式)

(1)、思想

通过客户端构造方法,注入不同的抽象实现子类类,执行相同的客户端方法,
执行不同的逻辑,替代if else,
公有逻辑都在抽象类里面定义好了,所有传入不同的抽象子类都会执行同一个公有逻辑。

(2)、步骤

 1. 创建抽象类,创建公有的具体方法和抽象方法 
 2. 创建不同的子类重写抽象方法 
 3. 在客户端通过构造方法,注入不同的子类。
 4. 调用的时候传入不同子类,就可以实现不同的私有逻辑。

(3)、代码

//策略抽象类,声明抽象方法和公共的方法
public abstract class IStrategy {

    public abstract void privatePrint();

    public void print() {
        System.out.println("公共策略");
    }
}

//具体策略1,重写抽象方法
public  class strategyImpl1 extends  IStrategy{

    @Override
    public void privatePrint() {
        System.out.println("私有策略1");
    }
}

//具体策略2,重写抽象方法
public  class strategyImpl2 extends IStrategy{

    @Override
    public void privatePrint() {
        System.out.println("私有策略2");
    }
}

//客户端,通过构造方法注入策略接口,声明执行策略接口方法的方法exec
public class Client {

    private IStrategy iStrategy;
    //构造方法注入策略接口
    public Client(IStrategy iStrategy) {
        this.iStrategy = iStrategy;
    }
    //客户端方法
    public void exec(){
        this.iStrategy.print();
        this.iStrategy.privatePrint();
    }
}

//策略模式,通过客户端构造方法,指定具体策略,执行相同的接口方法,执行不同的逻辑,替代if else
public class strategyTest {

    public static void main(String[] args) {
        Client client=new Client(new strategyImpl1());
        client.exec();
    }
}

二、command(命令模式)

(1)、思想

将命令执行的过程封装成命令对象,调用不同的命令对象方法,进行不同的操作。

(2)、步骤

 1. 声明命令抽象类,声明不同的方法 
 2. 声明具体命令类,继承抽象类,重写方法 
 3. 在客户端用抽象类变量指向具体的命令子类,执行方法。

(3)、代码

//命令抽象类
public abstract class Command {

    public abstract void doit();
    public abstract void undo();
}

public class Content {

    String msg="hello everybody";
}

//具体命令类
public class insertCommand extends Command{

    private Content content;

    public insertCommand(Content content) {
        this.content = content;
    }

    private String insertMsg="www";

    @Override
    public void doit() {
        content.msg+=insertMsg;
    }

    @Override
    public void undo() {
        content.msg=content.msg.substring(0,content.msg.length()-insertMsg.length());
    }
}

//命令模式,将执行逻辑封装成命令对象,可以方便的实现undo退回功能。
public class commandTest {

    public static void main(String[] args) {
        Content content=new Content();
        Command command=new insertCommand(content);
        command.doit();
        System.out.println(content.msg);
        command.undo();
        System.out.println(content.msg);
    }
}

三、memento(备忘录模式)

(1)、思想

	将每一步操作都封装成一个备忘录对象,由备忘录管理类进行管理,
	后面需要退回到那一步操作的时候,直接从备忘录管理对象里面获取。
	也就是对每一步操作做持久化并记录版本,方便后面回退到任意版本。

(2)、步骤

 1. 声明备忘录类,用于数据的详细信息 	
 2. 声明备忘录管理类,通过成员变量备忘录类列表和add/get等方法来管理备忘录对象。

(3)、代码

//备忘录类
public class Memento {

    //状态
    private String state;

    public Memento(String state) {
        this.state = state;
    }

    //获取状态
    public String getState() {
        return state;
    }
}

//备忘录管理类
public class CareTaker {

    private List<Memento> mementoList=new ArrayList<>();

    public void add(Memento memento){
        mementoList.add(memento);
    }

    public Memento get(int index){
        return mementoList.get(index);
    }
}

//备忘录创建类
public class Originator {

    //状态
    private String state;

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    //保存状态
    public Memento  saveStateToMemento(){
        return new Memento(state);
    }

    //获取状态
    public void getStateFromMemento(Memento Memento){
        state = Memento.getState();
    }
}

//备忘录状态,备忘录类记录每个阶段的数据(就是一个实体对象),
// 备忘录创建类,来创建备忘录(就是给实体对象赋值并初始化)
//备忘录管理类,将初始化好的备忘录实体加入到列表里面,以便随时恢复到指定状态
public class mementoTest {

    public static void main(String[] args) {
        //备忘录管理类
        CareTaker careTaker=new CareTaker();
        //备忘路创建类
        Originator originator=new Originator();

        //备忘录创建类生成状态,备忘录管理类保存
        originator.setState("save1");
        careTaker.add(originator.saveStateToMemento());
        originator.setState("save2");
        careTaker.add(originator.saveStateToMemento());

        System.out.println(careTaker.get(0).getState());
    }
}

四、state(状态模式)

(1)、思想

代替状态判断的if else语句,通过将状态抽象成对象,每个状态的执行方法实现不同的逻辑,
在客户端中就可以通过状态对象的不同来实现不同的逻辑。

(2)、步骤

 1. 声明一个状态接口,实现接口方法 
 2. 实现接口子类,重写接口方法 
 3. 客户端用接口对象指向不同的接口实现状态类,调用同一方法实现不同的逻辑。

(3)、代码

//抽象状态类
public interface absState {

    public void doit(Context context);
}

//主体对象
public class Context {

    //主体对象持有状态对象
    private absState absState;

    public absState getAbsState() {
        return absState;
    }

    public void setAbsState(absState absState) {
        this.absState = absState;
    }
}

public class startState implements absState{

    @Override
    public void doit(Context context) {
        context.setAbsState(this);
    }

    @Override
    public String toString() {
        return "startState{}";
    }
}

public class endState implements absState{

    @Override
    public void doit(Context context) {
        context.setAbsState(this);
    }

    @Override
    public String toString() {
        return "endState{}";
    }
}

//状态模式,将不同状态下的执行逻辑封装成不同的状态对象
//声明一个主体对象,声明多个状态对象,状态对象里面声明方法将当前状态设置为主体对象的状态
//然后在客户端用主体对象的状态属性.方法,即可通过状态的不同实现多态
public class stateTest {

    public static void main(String[] args) {
        //声明主体
        Context context=new Context();
        //声明状态
        absState start=new startState();
        //给主体赋上状态
        start.doit(context);
        System.out.println(context.getAbsState().toString());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值