访问者模式属于行为型模式。
访问者模式是一种将数据结构和数据操作分离的设计模式。
访问者模式比较复杂,而且实际使用的地方并不多。
访问者模式适用于数据结构稳定的元素操作上,一旦数据结构易变,则不适用。
角色说明:
Visitor(抽象访问者):接口或者抽象类,为每一个元素(Element)声明一个访问的方法。
ConcreteVisitor(具体访问者):实现抽象访问者中的方法,即对每一个元素都有其具体的访问行为。
Element(抽象元素):接口或者抽象类,定义一个accept方法,能够接受访问者(Visitor)的访问。
ConcreteElementA、ConcreteElementB(具体元素):实现抽象元素中的accept方法,通常是调用访问者提供的访问该元素的方法。
Client(客户端类):即要使用访问者模式的地方。
//创建抽象访问接口//因为需要存放属性所以采用abstract 抽象public abstract class web {private String name;public web(String name){this.name=name;}//授权public abstract void accept(Visitor visitor);//定义下载接口public abstract void dowonload();public String getName(){return this.name;}}//创建具体实现类public class Music extends web {public Music(String name) {super( name );}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}@Overridepublic void dowonload() {System.out.println("下载音乐");}}//创建具体实现类public class Video extends web {public Video(String name) {super( name );}@Overridepublic void accept(Visitor visitor) {visitor.visit(this);}@Overridepublic void dowonload() {System.out.println("下载视频");}}//抽象访问者public interface Visitor {void visit(Music music);void visit(Video video);}//具体访问者 PERSON ONEpublic class Idler implements Visitor{private String name;public Idler(String name){this.name=name;}@Overridepublic void visit(Music music) {System.out.println(name+"正在浏览音乐");}@Overridepublic void visit(Video video) {System.out.println(name+"正在浏览视频");}}//具体访问者 PERSON ONEpublic class IdlerTwo implements Visitor{private String name;public IdlerTwo(String name){this.name=name;}@Overridepublic void visit(Music music) {System.out.println(name+"正在浏览音乐");}@Overridepublic void visit(Video video) {System.out.println(name+"正在浏览视频");}}public class Websites {// 元素集合List <web> list = new ArrayList <>();public void accept(Visitor visitor) {Iterator <web> iterator = list.iterator();while (iterator.hasNext()) {iterator.next().accept( visitor );}}public void addWeb(web web) {list.add( web );}}public class VisitorClient {public static void main(String[] args) {Music wangyiyue = new Music("网易云音乐");Music kugou = new Music("酷狗");Video youku = new Video("优酷");Video iqiyi = new Video("爱奇艺");// 放入对象结构中Websites websites = new Websites();websites.addWeb(wangyiyue);websites.addWeb(kugou);websites.addWeb(youku);websites.addWeb(iqiyi);// 集合接受idler1的访问Visitor idler1 = new Idler("闲人1号");websites.accept(idler1);System.out.println("-------------------------------------");// 集合接受busy1的访问Visitor busy1 = new IdlerTwo("忙人2号");websites.accept(busy1);}}
总结:单一职责,从上面代码可以看出我们要控制用户的访问的元素,对某一个音乐产品下架,其实也只需要在对象结构中移除就可以了。
