博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
访问者模式
阅读量:6643 次
发布时间:2019-06-25

本文共 4919 字,大约阅读时间需要 16 分钟。

/** * 访问者模式:就是不同的人(访问者)对同一种资源(衣服)下的不同分类的表现不一致:举个例子,小孩,男人,女人,去服装店里逛,对童装,男装,女装的感兴趣是不一样的; * 这里小孩,男孩,女人就是访问者,男装,女装,童装就是资源或者elment,服装店就是对象结构: * * 小孩逛商店:对童装感兴趣 男人逛商店:对男装感兴趣,也会给小朋友买衣服,女人对童装,女装,男装都会感兴趣,因为可能会给子女,老公买衣服: * 所以访问者模式的结构: * * 1.一个访问者接口Visistor和多个实现类(如本例子中的男人,女人,小孩),该接口会有访问各种资源的方法,如本例中,每个访问者都会对男装,女装,童装进行访问 * 2.资源接口Elemnt和多个实现类,如本例的童装,男装,女装,每个资源类都会提供一个接受访问者的接口,在该接口调用访问者访问该资源的方法 * 3.一个对象结构:如本例的服装店,简单来说就是存储资源集合的对象 * * * * * *///访问者public interface Visistor {    //访问者可以访问所有的资源子类(这里是重点,有多少个子类,就添加多少个访问方法)    void buyChildrenCloth(ChildrenCloth cloth);    void buyManCloth(ManCloth cloth);    void buyWomenCloth(WomenCloth cloth);    //统计每个访问者买衣服总花费金额    void cost();}//访问者---小孩public class Children implements Visistor {    private BigDecimal amount=BigDecimal.ZERO;    @Override    public void buyChildrenCloth(ChildrenCloth cloth) {        System.out.println("我是小朋友,买衣服只会买小朋友的衣服");        amount=amount.add(cloth.getAmount());    }    @Override    public void buyManCloth(ManCloth cloth) {        System.out.println("我是小朋友,不会买妈妈的衣服");    }    @Override    public void buyWomenCloth(WomenCloth cloth) {        System.out.println("我是小朋友,不会买爸爸的衣服");    }    @Override    public void cost() {        System.out.println("我是小朋友这次买衣服总花费:"+amount.toString());    }}//访问者--男孩public class Man implements Visistor {    private BigDecimal amount=BigDecimal.ZERO;    @Override    public void buyChildrenCloth(ChildrenCloth cloth) {        System.out.println("我是爸爸,我会帮小朋友买衣服");        amount=amount.add(cloth.getAmount());    }    @Override    public void buyManCloth(ManCloth cloth) {        System.out.println("我是爸爸,我不会买老婆的衣服");    }    @Override    public void buyWomenCloth(WomenCloth cloth) {        System.out.println("我是爸爸,我会买自己的衣服");        amount=amount.add(cloth.getAmount());    }    @Override    public void cost() {        System.out.println("我是爸爸,这次买衣服总花费:"+amount.toString());    }}//访问者--女孩public class Women implements Visistor {    private BigDecimal amount=BigDecimal.ZERO;    @Override    public void buyChildrenCloth(ChildrenCloth cloth) {        System.out.println("我是妈妈,我会给小朋友买衣服");        amount=amount.add(cloth.getAmount());    }    @Override    public void buyManCloth(ManCloth cloth) {        System.out.println("我是妈妈,我会给老公买衣服");        amount=amount.add(cloth.getAmount());    }    @Override    public void buyWomenCloth(WomenCloth cloth) {        System.out.println("我是妈妈,我会给自己买衣服");        amount=amount.add(cloth.getAmount());    }    @Override    public void cost() {        System.out.println("我是妈妈,这次买衣服总花费:"+amount.toString());    }}//资源Elementpublic abstract class Cloth {    protected BigDecimal amount;    //资源接受的访问者    abstract void accept(Visistor visistor);}//资源--童装public class ChildrenCloth extends Cloth{    public ChildrenCloth(BigDecimal amount) {        this.amount = amount;    }    public BigDecimal getAmount() {        return amount;    }    @Override    public void accept(Visistor visistor) {        visistor.buyChildrenCloth(this);    }}//资源--男装public class ManCloth extends Cloth {    public ManCloth(BigDecimal amount) {        this.amount = amount;    }    public BigDecimal getAmount() {        return amount;    }    public void setAmount(BigDecimal amount) {        this.amount = amount;    }    @Override    public void accept(Visistor visistor) {        visistor.buyManCloth(this);    }}//资源女装public class WomenCloth extends Cloth {    public WomenCloth(BigDecimal amount) {        this.amount = amount;    }    public BigDecimal getAmount() {        return amount;    }    public void setAmount(BigDecimal amount) {        this.amount = amount;    }    @Override    public void accept(Visistor visistor) {        visistor.buyWomenCloth(this);    }}//结构对象,存储资源public class ClothShop {    private List
list=new ArrayList<>(); public void addCloth(Cloth cloth){ list.add(cloth); } //不同访问者逛商店 public void show(Visistor visistor){ for (Cloth cloth : list) { cloth.accept(visistor); } }}public class Test { public static void main(String[] args) { //创建一个服装店,并进货童装,男装,女装 ClothShop clothShop = new ClothShop();//服装店 ChildrenCloth childrenCloth = new ChildrenCloth(new BigDecimal("100"));//童装 ManCloth manCloth = new ManCloth(new BigDecimal("200"));//男装 WomenCloth womenCloth = new WomenCloth(new BigDecimal("300"));//女装 clothShop.addCloth(childrenCloth);//进货童装 clothShop.addCloth(manCloth);//进货男装 clothShop.addCloth(womenCloth);//进货女装 //儿童逛服装店 Children children = new Children();//儿童 clothShop.show(children);//逛店 children.cost();//总花费 //老公逛服装店 Man man = new Man(); //老公 clothShop.show(man);//逛店 man.cost();//总花费 //老婆逛服装店 Women women = new Women(); //老婆 clothShop.show(women);//逛店 women.cost();//总花费 }}

 

转载于:https://www.cnblogs.com/yangxiaohui227/p/10942590.html

你可能感兴趣的文章
FormView 显示、更新、插入、删除数据库操作[ASP.NET源代码](一)
查看>>
IIS连接127.0.0.1要输入用户名密码的解决办法
查看>>
Linux 内核中container_of的理解
查看>>
GET和POST两种基本请求方法的区别
查看>>
Android NDK开发三:java和C\C++交互
查看>>
Azure 网站的新增功能:可配置的环境变量
查看>>
微软开放技术热烈祝贺开源社成立!
查看>>
Download all Apple open source OS X files at once
查看>>
Objective-C点语法
查看>>
iOS应用程序状态切换相关
查看>>
理解AngularJS生命周期:利用ng-repeat动态解析自定义directive
查看>>
Programming Ability Test学习 1029. 旧键盘(20)
查看>>
控制器
查看>>
一些小问题
查看>>
使用python实现往手机发短信(基于twilio)
查看>>
Ubuntu开启Samba服务器,实现文件共享
查看>>
unity编程心得
查看>>
第十篇 javascript基础语法
查看>>
【洛谷团队题目】
查看>>
虚拟机Ubuntu16.04 Server设置NAT方式修改ip
查看>>