命令模式详细介绍及实例解析

1.简介

The command pattern is a behavioral design pattern in which an object is used to encapsulate all information needed to perform an action or trigger an event at a later time. This information includes the method name, the object that owns the method and values for the method parameters.

(命令模式是一种行为设计模式,其中一个对象用于封装所有信息,以便在以后执行某个操作或触发某个事件。此信息包括方法名称、拥有方法的对象和方法参数的值)

—— quote from Wikipedia

	简而言之,命令模式就是将封装了相关方法的类进行收集并调用,最终实现相应的结果。

2.命令模式的优缺点:

优点:

1、降低了系统耦合度。

2、新的命令可以很容易添加到系统中去。

缺点:

使用命令模式可能会导致某些系统有过多的具体命令类。

3.相关实例解析

  		举个常见的例子,小明去上海旅游,有出发和返程的方法。然后代理类放入相关的类,将其正确的执行。

相关代码:

// 旅游接口
interface Place {
    void travel();
}

class Person {

    private String name = "xiaoming";
    private int age = 18;

    // 出发
    public void setOff() {
        System.out.println("name:[" + name + "] " + "age:[" + age + "] " + "set off");

    }

    // 返程
    public void getBack() {
        System.out.println("name:[" + name + "] " + "age:[" + age + "] " + "get back");
    }
}


// 上海旅游
class GoToShangHai implements Place {

    private Person person;

    public GoToShangHai(Person person) {
        this.person = person;
    }

    @Override
    public void travel() {
        person.setOff();
        System.out.println("tarvel around ShangHai");
    }
}

// 从上海返程
class BackFromShangHai implements Place {

    private Person person;

    public BackFromShangHai(Person person) {
        this.person = person;
    }

    @Override
    public void travel() {
        person.getBack();
        System.out.println("get back from ShangHai");
    }
}

class  Proxy{
    private List<Place> placeList = new ArrayList<>();

    public void travelPlace(Place place) {
        placeList.add(place);
    }

    public void places() {
        for (Place place : placeList) {
            place.travel();
        }
        placeList.clear();
    }

}


public class CommondDemo {

    public static void main(String[] args) {
        Person person = new Person();
        GoToShangHai goToShangHai = new GoToShangHai(person);
        BackFromShangHai backFromShangHai = new BackFromShangHai(person);

        Proxy proxy = new Proxy();
        proxy.travelPlace(goToShangHai);
        proxy.travelPlace(backFromShangHai);

        proxy.places();
    }
}
输出结果:
name:[xiaoming] age:[18] set off
tarvel around ShangHai
name:[xiaoming] age:[18] get back
get back from ShangHai
posted @ 2020-01-31 15:32  城南少年与猫  阅读(542)  评论(0编辑  收藏  举报