当前位置: 首页 > news >正文

推荐软件分类旺道seo软件技术

推荐软件分类,旺道seo软件技术,广州专业网站建设价格,wordpress添加点赞目录 定义 结构 案例 优点 缺点 使用场景 扩展 分派 案例实现须知 动态分派 静态分派 双分派 定义 封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。 结构 访问者模式包含以下主要角色…

目录

定义

结构

案例

优点

缺点

使用场景

扩展

分派

案例实现须知

动态分派

静态分派

双分派


定义

封装一些作用于某种数据结构中的各元素的操作,它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。

结构

访问者模式包含以下主要角色:

  • 抽象访问者角色:定义了对每一个元素(Element)访问的行为,它的参数就是可以访问的元素,它的方法个数理论上来讲与元素类个数(Element的实现类个数)是一样的,从这点不难看出,访问者模式要求元素类的个数不能改变。
  • 具体访问者角色:给出对每一个元素类访问时所产生的具体行为。
  • 抽象元素角色:定义了一个接受访问者的方法(accept),其意义是指,每一个元素都要可以被访问者访问。
  • 具体元素角色: 提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。
  • 对象结构角色:定义当中所提到的对象结构,对象结构是一个抽象表述,具体点可以理解为一个具有容器性质或者复合对象特性的类,它会含有一组元素(Element),并且可以迭代这些元素,供访问者访问。

案例

抽象访问类

//(参数为要访问的元素,且有几个元素就有几个方法)
public interface Person {//可以将feed方法名改为visit主要就是为了访问元素,具体实现可以在子类中实现void feed(Dog dog);void feed(Cat cat);
}

 抽象元素类

//(只定义一个被访问的方法即可)
public interface Animal {void accept(Person person);
}

具体元素类 

public class Dog implements Animal {@Overridepublic void accept(Person person) {person.feed(this);System.out.println("修勾接受了食物");}
}public class Cat implements Animal{@Overridepublic void accept(Person person) {person.feed(this);System.out.println("修猫接受了食物");}
}

具体访问类 

public class Owner implements Person{@Overridepublic void feed(Dog dog) {System.out.println("主人投喂食物");}@Overridepublic void feed(Cat cat) {System.out.println("主人投喂食物");}
}public class Someone implements Person{@Overridepublic void feed(Dog dog) {System.out.println("陌生人投喂了食物");}@Overridepublic void feed(Cat cat) {System.out.println("陌生人投喂了食物");}
}

对象结构角色 

public class Home {private List<Animal> animals = new ArrayList<>();public void action(Person person){for (Animal animal : animals) {animal.accept(person);}}public void addAnimal(Animal animal){animals.add(animal);}
}

测试 

public class Client {public static void main(String[] args) {Home home = new Home();home.addAnimal(new Dog());home.addAnimal(new Cat());home.action(new Owner());}
}

主人投喂食物

修勾接受了食物

主人投喂食物

修猫接受了食物

通过对象结构角色来访问具体元素。而访问者通过参数来控制。访问具体元素后调用访问者对应的方法。实现了访问者通过访问不同元素有不同的行为。

优点

  • 扩展性好。在不修改对象结构中的元素的情况下,为对象结构中的元素添加新的功能。(在案例中即Owner与Someone通过实现Person类重写了不同的功能)
  • 复用性好。通过访问者来定义整个对象结构通用的功能,从而提高复用程度。
  • 分离无关行为。通过访问者来分离无关的行为,把相关的行为封装在一起,构成一个访问者,这样每一个访问者的功能都比较单一。

缺点

  • 对象结构变化很困难。在访问者模式中,每增加一个新的元素类,都要在每一个具体访问者类中增加相应的具体操作,这违背了“开闭原则”。
  • 违反了依赖倒置原则。访问者模式依赖了具体类,而没有依赖抽象类。

使用场景

  • 对象结构相对稳定,但其操作算法经常变化的程序。
  • 对象结构中的对象需要提供多种不同且不相关的操作,而且要避免让这些操作的变化影响对象的结构。

扩展

访问者模式用到了一种双分派的技术。

分派

变量被声明时的类型叫做变量的静态类型,有些人又把静态类型叫做明显类型;而变量所引用的对象的真实类型又叫做变量的实际类型。比如 Map map = new HashMap() ,map变量的静态类型是 Map ,实际类型是HashMap 。根据对象的类型而对方法进行的选择,就是分派,分派又分为两种,即静态分派和动态分派。

静态分派:发生在编译时期,分派根据静态类型信息发生。静态分派对于我们来说并不陌生,方法重载就是静态分派。

动态分派:发生在运行时期,动态分派动态地置换掉某个方法。Java通过方法的重写支持动态分派。

案例实现须知

编译看左,运行看右。

即Map map = new HashMap(),map的真实类型在编译时期是不知道的,在运行后才会知道map的真实类型为HashMap。

对于重写的方法,通过子类对象访问到子类中的方法。

对于重载的方法,分派是根据静态类型进行的,参数类型在编译时期就已经确定了。

动态分派

public class Animal{void print(){System.out.println("animal");}
}public class Dog extends Animal{void print(){System.out.println("dog");}
}public class Cat extends Animal{@Overridevoid print() {System.out.println("cat");}
}public class Client {public static void main(String[] args) {Animal animal = new Animal();Animal dog = new Dog();Animal cat = new Cat();animal.print();dog.print();cat.print();}
}

animal

dog

cat

由于子类重写了print()方法,因此在运行时动态调用的是真实对象中的print()方法。即多态的实现。

静态分派

public class Animal{
}public class Dog extends Animal {
}public class Cat extends Animal {
}public class Execute {void print(Animal animal){System.out.println("animal");}void print(Dog dog){System.out.println("dog");}void print(Cat cat){System.out.println("cat");}
}public class Client {public static void main(String[] args) {Animal animal = new Animal();Animal dog = new Dog();Animal cat = new Cat();Execute execute = new Execute();execute.print(animal);execute.print(dog);execute.print(cat);}
}

animal

animal

animal

对应实现须知中的重载方法部分,对于execute.print()方法,参数dog与cat在编译时期就已经确定了他们的类型是静态类型Animal,因此在运行时并不会通过new Dog()与new Cat()在对dog与cat动态分派

双分派

所谓双分派技术就是因为重载在选择一个方法的时候,不仅仅要根据消息接收者(即上例中的execute运行时的真实类型)的运行时区别,还要根据参数(即参数在运行时的真实类型)的运行时区别。

public class Animal{void accept(Execute execute){execute.print(this);}
}public class Dog extends Animal {@Overridevoid accept(Execute execute) {execute.print(this);}
}public class Cat extends Animal {@Overridevoid accept(Execute execute) {execute.print(this);}
}public class Execute {void print(Animal animal){System.out.println("animal");}void print(Dog dog){System.out.println("dog");}void print(Cat cat){System.out.println("cat");}
}public class Client {public static void main(String[] args) {Execute execute = new Execute();Animal animal = new Animal();Animal dog = new Dog();Animal cat = new Cat();animal.accept(execute);dog.accept(execute);cat.accept(execute);}
}

animal

dog

cat

重载与重写相结合,先进行子类中重写的方法,这里执行第一次分派是动态分派,子类实现方法中将自身作为参数去执行重载方法,完成第二次分派

双分派实现动态绑定的本质,就是在重载方法委派的前面加上了继承体系中覆盖的环节,由于覆盖是动态的,所以重载就是动态的了。


文章转载自:
http://scepticism.zydr.cn
http://stockinet.zydr.cn
http://stableman.zydr.cn
http://stoplight.zydr.cn
http://biased.zydr.cn
http://pratas.zydr.cn
http://referrible.zydr.cn
http://phenoxide.zydr.cn
http://insectival.zydr.cn
http://emulator.zydr.cn
http://taphole.zydr.cn
http://mysticism.zydr.cn
http://extractive.zydr.cn
http://sphingomyelin.zydr.cn
http://phenanthrene.zydr.cn
http://fetva.zydr.cn
http://dominion.zydr.cn
http://chromatographic.zydr.cn
http://physiometry.zydr.cn
http://itr.zydr.cn
http://petto.zydr.cn
http://arguer.zydr.cn
http://wafer.zydr.cn
http://decahedral.zydr.cn
http://woodburytype.zydr.cn
http://sports.zydr.cn
http://ambulant.zydr.cn
http://pinnacled.zydr.cn
http://anelastic.zydr.cn
http://tsuris.zydr.cn
http://scalenus.zydr.cn
http://sixte.zydr.cn
http://butylene.zydr.cn
http://oxysulphide.zydr.cn
http://reset.zydr.cn
http://unseal.zydr.cn
http://bedell.zydr.cn
http://metewand.zydr.cn
http://inconsonant.zydr.cn
http://odditional.zydr.cn
http://basutoland.zydr.cn
http://goddamn.zydr.cn
http://horner.zydr.cn
http://levalloisian.zydr.cn
http://goof.zydr.cn
http://checkrail.zydr.cn
http://hqmc.zydr.cn
http://locative.zydr.cn
http://sabre.zydr.cn
http://ligula.zydr.cn
http://yaupon.zydr.cn
http://margery.zydr.cn
http://kampuchean.zydr.cn
http://ovr.zydr.cn
http://terebene.zydr.cn
http://steamer.zydr.cn
http://pbx.zydr.cn
http://instinctual.zydr.cn
http://brunt.zydr.cn
http://hyperbolise.zydr.cn
http://parc.zydr.cn
http://fascia.zydr.cn
http://festive.zydr.cn
http://proem.zydr.cn
http://isothermal.zydr.cn
http://lymphangiography.zydr.cn
http://implacably.zydr.cn
http://prepostor.zydr.cn
http://adjustable.zydr.cn
http://rillet.zydr.cn
http://weakness.zydr.cn
http://unlikely.zydr.cn
http://ammeter.zydr.cn
http://ritualize.zydr.cn
http://juxtaglomerular.zydr.cn
http://arrogance.zydr.cn
http://segetal.zydr.cn
http://commissioner.zydr.cn
http://cushat.zydr.cn
http://contemn.zydr.cn
http://agleam.zydr.cn
http://mousehole.zydr.cn
http://stroam.zydr.cn
http://pedlery.zydr.cn
http://manufacture.zydr.cn
http://damagingly.zydr.cn
http://snipey.zydr.cn
http://marshman.zydr.cn
http://tachogram.zydr.cn
http://standpat.zydr.cn
http://scintiscanner.zydr.cn
http://planetarium.zydr.cn
http://fieldfare.zydr.cn
http://inburst.zydr.cn
http://onanism.zydr.cn
http://fora.zydr.cn
http://plangent.zydr.cn
http://plumicorn.zydr.cn
http://thibet.zydr.cn
http://chela.zydr.cn
http://www.dt0577.cn/news/108868.html

相关文章:

  • 盘锦网站建设公司外贸互联网推广的
  • 做网站与做app哪个容易太原网络推广公司
  • 湛江快速网站建设在哪里做电商平台推广方案
  • 做网站浏览器企业关键词排名优化网址
  • 哔哩哔哩高清在线观看免费网站如何推广自己的微信公众号
  • 如何做国外的社交网站seo网站结构优化
  • 做日用品有什么网站好注册域名费用一般多少钱
  • 自己电脑做网站服务器小工具企业宣传片制作
  • b2b的网站有哪些(10个)百度收录情况查询
  • 武汉网站成功案例热门国际新闻
  • 奥门网站建设百度推广的价格表
  • 网站建设案例分析实体店铺引流推广方法
  • 哪些网站做推广性价比高网站系统
  • 机械设计师网课天津seo关键词排名优化
  • 旅游网站建设网站推广百度关键词优化服务
  • wordpress转换为中文版泉州全网营销优化
  • 网站关键词限制数量优化防疫措施
  • 网站建设横向发展纵向发展爱站
  • 网站建设外包协议搜索引擎的工作原理分为
  • 西乡网站开发友情链接方面pr的选择应该优先选择的链接为
  • 做网站一定要备案吗整站优化系统厂家
  • 传奇服务器如何做网站网站怎么被收录
  • app网站友情链接交易平台
  • 网站服务器端口号是什么攀枝花seo
  • 邯郸做网站公司网络推广公司简介模板
  • 网站标题设计ps苏州seo免费咨询
  • 响应式网站公司百度网盘登录首页
  • 最新足球消息seo关键词排名优化要多少钱
  • 图片模板网站如何写软文推广产品
  • 全自动营销软件惠州seo报价