设计模式从零开始——代理模式

来源:互联网 发布:qq空间个性域名注册 编辑:程序博客网 时间:2024/06/18 18:16

小时候家里来客人,老爸忙着招呼客人,抽不出空去买东西,每次都是让我去楼下小卖店买烟买酒,我当时特别喜欢做这件事,

因为每次老爸都会多给我几块钱,让我给自己买些零食:)。。。。。回想起来这种有些事自己不想做或者没时间做,找人帮忙去做,

应该就是我最早接触的代理模式。


所以代理模式的精髓就是,把A要做的事情,不管出于什么考虑,转交给B去做,最终达成同样的目的。


通常适用于:远程代理、虚拟代理、安全代理、智能代理等等,基于我之前做的项目经验,接触最多的就是做网络爬虫时使用IP代理池,

随机切换使用不同代理,防止IP被网站屏蔽。


接下来以机器人代替人来做家务这一情景模拟代理模式,以下是主要代码:


房子类,用来指定家务在哪里做:

public class Room {    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}


具体家务的抽象方法:

public interface IBehavior {    public void laundry();    public void cook();    public void sweep();}


人做家务:

public class People implements IBehavior {    Room room;    String name;    public People(Room room) {        this.room = room;    }    public People(Room room, String name) {        this.room = room;        this.name = name;    }    @Override    public void laundry() {        if (Strings.isNullOrEmpty(name)) {            System.out.println(room.getName() + " 洗衣服");        } else {            System.out.println(name + " 在 " + room.getName() + " 洗衣服");        }    }    @Override    public void cook() {        if (Strings.isNullOrEmpty(name)) {            System.out.println(room.getName() + " 做饭");        } else {            System.out.println(name + " 在 " + room.getName() + " 做饭");        }    }    @Override    public void sweep() {        if (Strings.isNullOrEmpty(name)) {            System.out.println(room.getName() + " 扫地");        } else {            System.out.println(name + " 在 " + room.getName() + " 扫地");        }    }}

机器人做家务:

public class Robot implements IBehavior {    People people;    String name;    public Robot(Room room, String name) {        people = new People(room);        this.name = name;    }    @Override    public void laundry() {        System.out.print(name + " 在 ");        people.laundry();    }    @Override    public void cook() {        System.out.print(name + " 在 ");        people.cook();    }    @Override    public void sweep() {        System.out.print(name + " 在 ");        people.sweep();    }}

客户端代码:

public class Controller {    public static void main(String[] args) {        Room room = new Room();        room.setName("大冰的小屋");        System.out.println("===========代理机器人做家务=============");        Robot robot = new Robot(room, "机器人");        robot.laundry();        robot.cook();        robot.sweep();        System.out.println("\n===========人做家务=============");        People people = new People(room,"Bruce");        people.laundry();        people.cook();        people.sweep();    }}


执行结果截图: