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

做图的兼职网站h5页面免费制作

做图的兼职网站,h5页面免费制作,如何实现一个制作好的网站,打通WordPress和微信公众号访问者模式 1 访问者模式介绍 访问者模式在实际开发中使用的非常少,因为它比较难以实现并且应用该模式肯能会导致代码的可读性变差,可维护性变差,在没有特别必要的情况下,不建议使用访问者模式. 访问者模式(Visitor Pattern) 的原始定义是#xff1a;允许在运行时将一个或多…访问者模式 1 访问者模式介绍 访问者模式在实际开发中使用的非常少,因为它比较难以实现并且应用该模式肯能会导致代码的可读性变差,可维护性变差,在没有特别必要的情况下,不建议使用访问者模式. 访问者模式(Visitor Pattern) 的原始定义是允许在运行时将一个或多个操作应用于一组对象将操作与对象结构分离。 这个定义会比较抽象但是我们依然能看出两个关键点 一个是: 运行时使用一组对象的一个或多个操作比如对不同类型的文件.pdf、.xml、.properties进行扫描 另一个是: 分离对象的操作和对象本身的结构比如扫描多个文件夹下的多个文件对于文件来说扫描是额外的业务操作如果在每个文件对象上都加一个扫描操作太过于冗余而扫描操作具有统一性非常适合访问者模式。 访问者模式主要解决的是数据与算法的耦合问题, 尤其是在数据结构比较稳定,而算法多变的情况下.为了不污染数据本身,访问者会将多种算法独立归档,并在访问数据时根据数据类型自动切换到对应的算法,实现数据的自动响应机制,并确保算法的自由扩展. 2 访问者模式原理 访问者模式包含以下主要角色: 抽象访问者Visitor角色可以是接口或者抽象类,定义了一系列操作方法,用来处理所有数据元素,通常为同名的访问方法,并以数据元素类作为入参来确定那个重载方法被调用.具体访问者ConcreteVisitor角色访问者接口的实现类,可以有多个实现,每个访问者都需要实现所有数据元素类型的访问重载方法.抽象元素Element角色被访问的数据元素接口,定义了一个接受访问者的方法accept其意义是指每一个元素都要可以被访问者访问。具体元素ConcreteElement角色 具体数据元素实现类,提供接受访问方法的具体实现而这个具体的实现通常情况下是使用访问者提供的访问该元素类的方法,其accept实现方法中调用访问者并将自己 “this” 传回。对象结构Object Structure角色包含所有可能被访问的数据对象的容器,可以提供数据对象的迭代功能,可以是任意类型的数据结构.客户端 ( Client ) : 使用容器并初始化其中各类数据元素,并选择合适的访问者处理容器中的所有数据对象. 3 访问者模式实现 我们以超市购物为例,假设超市中的三类商品: 水果,糖果,酒水进行售卖. 我们可以忽略每种商品的计价方法,因为最终结账时由收银员统一集中处理,在商品类中添加计价方法是不合理的设计.我们先来定义糖果类和酒类、水果类. /*** 抽象商品父类**/ public abstract class Product {private String name; //商品名private LocalDate producedDate; // 生产日期private double price; //单品价格public Product(String name, LocalDate producedDate, double price) {this.name name;this.producedDate producedDate;this.price price;}public String getName() {return name;}public void setName(String name) {this.name name;}public LocalDate getProducedDate() {return producedDate;}public void setProducedDate(LocalDate producedDate) {this.producedDate producedDate;}public double getPrice() {return price;}public void setPrice(double price) {this.price price;} }/*** 糖果类**/ public class Candy extends Product{public Candy(String name, LocalDate producedDate, double price) {super(name, producedDate, price);} }/*** 酒水类**/ public class Wine extends Product{public Wine(String name, LocalDate producedDate, double price) {super(name, producedDate, price);} }/*** 水果类**/ public class Fruit extends Product{//重量private float weight;public Fruit(String name, LocalDate producedDate, double price, float weight) {super(name, producedDate, price);this.weight weight;}public float getWeight() {return weight;}public void setWeight(float weight) {this.weight weight;} }访问者接口 收银员就类似于访问者,访问用户选择的商品,我们假设根据生产日期进行打折,过期商品不能够出售. 注意这种计价策略不适用于酒类,作为收银员要对不同商品应用不同的计价方法. /*** 访问者接口-根据入参不同调用对应的重载方法**/ public interface Visitor {public void visit(Candy candy); //糖果重载方法public void visit(Wine wine); //酒类重载方法public void visit(Fruit fruit); //水果重载方法 }具体访问者 创建计价业务类,对三类商品进行折扣计价,折扣计价访问者的三个重载方法分别实现了3类商品的计价方法,体现了visit() 方法的多态性. /*** 折扣计价访问者类**/ public class DiscountVisitor implements Visitor {private LocalDate billDate;public DiscountVisitor(LocalDate billDate) {this.billDate billDate;System.out.println(结算日期: billDate);}Overridepublic void visit(Candy candy) {System.out.println(糖果: candy.getName());//获取产品生产天数long days billDate.toEpochDay() - candy.getProducedDate().toEpochDay();if(days 180){System.out.println(超过半年的糖果,请勿食用!);}else{double rate 0.9;double discountPrice candy.getPrice() * rate;System.out.println(糖果打折后的价格NumberFormat.getCurrencyInstance().format(discountPrice));}}Overridepublic void visit(Wine wine) {System.out.println(酒类: wine.getName(),无折扣价格!);System.out.println(原价: NumberFormat.getCurrencyInstance().format(wine.getPrice()));}Overridepublic void visit(Fruit fruit) {System.out.println(水果: fruit.getName());//获取产品生产天数long days billDate.toEpochDay() - fruit.getProducedDate().toEpochDay();double rate 0;if(days 7){System.out.println(超过七天的水果,请勿食用!);}else if(days 3){rate 0.5;}else{rate 1;}double discountPrice fruit.getPrice() * fruit.getWeight() * rate;System.out.println(水果价格: NumberFormat.getCurrencyInstance().format(discountPrice));}public static void main(String[] args) {LocalDate billDate LocalDate.now();Candy candy new Candy(徐福记,LocalDate.of(2022,10,1),10.0);System.out.println(糖果: candy.getName());double rate 0.0;long days billDate.toEpochDay() - candy.getProducedDate().toEpochDay();System.out.println(days);if(days 180){System.out.println(超过半年的糖果,请勿食用!);}else{rate 0.9;double discountPrice candy.getPrice() * rate;System.out.println(打折后的价格NumberFormat.getCurrencyInstance().format(discountPrice));}} }客户端 public class Client {public static void main(String[] args) {//德芙巧克力,生产日期2002-5-1 ,原价 10元Candy candy new Candy(德芙巧克力,LocalDate.of(2022,5,1),10.0);Visitor visitor new DiscountVisitor(LocalDate.of(2022,10,11));visitor.visit(candy);} }上面的代码虽然可以完成当前的需求,但是设想一下这样一个场景: 由于访问者的重载方法只能对当个的具体商品进行计价,如果顾客选择了多件商品来结账时,就可能会引起重载方法的派发问题(到底该由谁来计算的问题). 首先我们定义一个接待访问者的类 Acceptable,其中定义了一个accept(Visitor visitor)方法, 只要是visitor的子类都可以接收. /*** 接待者接口(抽象元素角色)**/ public interface Acceptable {//接收所有的Visitor访问者的子类实现类public void accept(Visitor visitor); }/*** 糖果类**/ public class Candy extends Product implements Acceptable{public Candy(String name, LocalDate producedDate, double price) {super(name, producedDate, price);}Overridepublic void accept(Visitor visitor) {//accept实现方法中调用访问者并将自己 this 传回。this是一个明确的身份,不存在任何泛型visitor.visit(this);} }//酒水与水果类同样实现Acceptable接口,重写accept方法测试 public class Client {public static void main(String[] args) {// //德芙巧克力,生产日期2002-5-1 ,原价 10元Candy candy new Candy(德芙巧克力,LocalDate.of(2022,5,1),10.0);Visitor visitor new DiscountVisitor(LocalDate.of(2022,10,11));visitor.visit(candy);//模拟添加多个商品的操作ListAcceptable products Arrays.asList(new Candy(金丝猴奶糖,LocalDate.of(2022,6,10),10.00),new Wine(衡水老白干,LocalDate.of(2020,6,10),100.00),new Fruit(草莓,LocalDate.of(2022,10,12),50.00,1));Visitor visitor new DiscountVisitor(LocalDate.of(2022,10,17));for (Acceptable product : products) {product.accept(visitor);}} }代码编写到此出,就可以应对计价方式或者业务逻辑的变化了,访问者模式成功地将数据资源需实现接待者接口与数据算法 需实现访问者接口分离开来。重载方法的使用让多样化的算法自成体系多态化的访问者接口保证了系统算法的可扩展性数据则保持相对固定最终形成⼀个算法类对应⼀套数据。 4 访问者模式总结 访问者模式优点 扩展性好 在不修改对象结构中的元素的情况下为对象结构中的元素添加新的功能。 复用性好 通过访问者来定义整个对象结构通用的功能从而提高复用程度。 分离无关行为 通过访问者来分离无关的行为把相关的行为封装在一起构成一个访问者这样每一个访问者的功能都比较单一。 访问者模式缺点 对象结构变化很困难 在访问者模式中每增加一个新的元素类都要在每一个具体访问者类中增加相应的具体操作这违背了“开闭原则”。 违反了依赖倒置原则 访问者模式依赖了具体类而没有依赖抽象类。 使用场景 当对象的数据结构相对稳定而操作却经常变化的时候。 比如上面例子中路由器本身的内部构造也就是数据结构不会怎么变化但是在不同操作系统下的操作可能会经常变化比如发送数据、接收数据等。 需要将数据结构与不常用的操作进行分离的时候。 比如扫描文件内容这个动作通常不是文件常用的操作但是对于文件夹和文件来说和数据结构本身没有太大关系树形结构的遍历操作扫描是一个额外的动作如果给每个文件都添加一个扫描操作会太过于重复这时采用访问者模式是非常合适的能够很好分离文件自身的遍历操作和外部的扫描操作。 需要在运行时动态决定使用哪些对象和方法的时候。 比如对于监控系统来说很多时候需要监控运行时的程序状态但大多数时候又无法预知对象编译时的状态和参数这时使用访问者模式就可以动态增加监控行为。
http://www.pierceye.com/news/91316/

相关文章:

  • 德阳网站怎么做seowordpress app 插件
  • 水文化建设网站网站排名优化公司哪家好
  • 网站图片的暗纹是怎么做的做家教中介 不建网站怎么做
  • 学校网站建设价格明细表淮安网站网站建设
  • 怎样做代刷网站长电子商务网站开发费用入账
  • 网站健设推广产品多少钱商业网站开发的实训小结怎么写
  • 优秀的网站建设推荐做百度推广是网站好还是阿里好
  • 响应式网站开发费用做不规则几何图形的网站
  • 西安网站建设优化集团门户网站建设不足
  • 深圳建网站的公企业做网站有什么用
  • wordpress插件 2017南宁seo排名外包
  • 在淘宝上开网店的详细步骤丹东网站seo
  • 网站建设外包公司招聘发帖子有哪些app平台
  • 网站风格发展趋势快设计
  • 稳定的网络建站咨询电话正规网站建设咨询电话
  • 请人代做谷歌外贸网站做购彩网站是怎么盈利的
  • 网站内链怎么删除wordpress如何下载
  • 深圳网站公司有了域名搭建网站详细步骤
  • 主机宝 建设网站怎么知道网站哪家公司做的
  • 1元做网站方案城乡建设住房建设厅官方网
  • 厦门网站网页设网页素材html
  • 活字格能开发企业网站吗商品门户网站解决方案
  • 网站虚拟主机内存不足能不能链接美工怎么做网站效果图
  • 网站版建设软件开发培训班有哪些
  • 舟山市城市建设档案馆网站武夷山景区网站建设特点
  • 北京建设工程质量总站网站哈尔滨网站只做
  • 做外单网站有哪些网站开发工程师需要什么技术
  • 跨境电商自己做网站引流会宁县建设局网站
  • 对于学校网站建设的建议google推广公司哪家好
  • 国外做装饰画的网站公司logo设计图片欣赏