• 常见的设计模式(下)


    hello,家人们好,今天给大家带来上节课未讲完的 常见的设计模式

    目录

    一.🥘🥘抽象工厂

    二.🍟🍟责任链模式

    责任链模式的概念

    责任链模式的使用场景

    三.🍕🍕观察者模式

    观察者模式的概念


    一.🥘🥘抽象工厂

    工厂分为两种,一种是普通工厂,一种是抽象工厂,

    抽象工厂用于生成指定产品族。一个产品族中包括多种产品.

    我们先来建一个总父类,叫Boss,

    1. package com.zking.dao;
    2. public abstract class Boss {
    3. public abstract One a();
    4. public abstract Tow b();
    5. public static APhone aphone=new APhone();
    6. public static SunPhone sumphone=new SunPhone();
    7. public final static int Aone=1;
    8. public final static int Stow=2;
    9. public static Boss getType(int type) {
    10. switch (type) {
    11. case 1:
    12. return aphone;
    13. case 2:
    14. return sumphone;
    15. default:
    16. return null;
    17. }
    18. }
    19. }

    One

    1. package com.zking.dao;
    2. public abstract class One {
    3. abstract String price();
    4. }

    然后指定两个规则,如果你的产品需要交易的话,就必须有我这两个东西

    Tow

    1. package com.zking.dao;
    2. public abstract class Tow {
    3. abstract String name();
    4. }

    然后这边模拟两个公司,里面需要有我规定的那两个规则

    1. package com.zking.dao;
    2. public class APhone extends Boss{
    3. @Override
    4. public One a() {
    5. return new AOnePrice();
    6. }
    7. @Override
    8. public Tow b() {
    9. return new ATowName();
    10. }
    11. }

    第二家公司

    1. package com.zking.dao;
    2. public class SunPhone extends Boss{
    3. @Override
    4. public One a() {
    5. return new SunOnePrice();
    6. }
    7. @Override
    8. public Tow b() {
    9. return new SumTowName();
    10. }
    11. }

    第一家公司的两条规则详情

    1. package com.zking.dao;
    2. public class AOnePrice extends One{
    3. @Override
    4. String price() {
    5. return "这件衣服345元";
    6. }
    7. }

    1. package com.zking.dao;
    2. public class ATowName extends Tow{
    3. @Override
    4. String name() {
    5. return "这件是连衣裙";
    6. }
    7. }

    第二家公司对于产品生成的详情

    1. package com.zking.dao;
    2. public class SunOnePrice extends One{
    3. @Override
    4. String price() {
    5. return "这个是888元";
    6. }
    7. }

    1. package com.zking.dao;
    2. public class SumTowName extends Tow{
    3. @Override
    4. String name() {
    5. return "这个手机是三星";
    6. }
    7. }

    最后我们来测试一下

    1. package com.zking.dao;
    2. public class Test {
    3. public static void main(String[] args) {
    4. // Boss aphone=Boss.getType(Boss.Aone);
    5. // One one=aphone.a();
    6. // Tow tow=aphone.b();
    7. // System.out.println(one.price());
    8. // System.out.println(tow.name());
    9. Boss aphone=Boss.getType(Boss.Stow);
    10. One one=aphone.a();
    11. Tow tow=aphone.b();
    12. System.out.println(one.price());
    13. System.out.println(tow.name());
    14. }
    15. }

    最后运行结果是:

     

    二.🍟🍟责任链模式

    • 责任链模式的概念

    责任链模式是一个对象的行为模式,很多对象之间形成一条链条,处理请求在这个链条上进行传递,直到责任链的上的某个对象决定处理请求(也可扩展为几个对象处理),这个过程对于用户来说是透明的,也就是说用户不需要知道是责任链上的哪个对象处理的请求,对请求是否处理由链条上的对象自己决定的.

    • 责任链模式的使用场景

    web容器中的过滤器算是责任链模式的一个经典场景

    另外举个例子:当在论坛上提交内容时,论坛系统需要对一些关键词进行处理,看看有没有包含一些敏敢词汇,而这些敏感词汇我们可以使用责任链模式进行处理.

    eg:

    我们先写一个实体类,并且写出它的无参构造和有参构造,还有toString打印方法,还有get/set方法

    1. package com.zrl.pojo;
    2. public class Info {
    3. private String Info;
    4. public Info() {
    5. // TODO Auto-generated constructor stub
    6. }
    7. public Info(String info) {
    8. super();
    9. Info = info;
    10. }
    11. @Override
    12. public String toString() {
    13. return "Info [Info=" + Info + "]";
    14. }
    15. public String getInfo() {
    16. return Info;
    17. }
    18. public void setInfo(String info) {
    19. Info = info;
    20. }
    21. }

    然后我们定义一个接口,进行一个约束

    1. package com.zrl.dao;
    2. import com.zrl.pojo.Info;
    3. /**
    4. * 责任链模式,一个接口,进行约束
    5. * @author zjjt
    6. *
    7. */
    8. public interface Boss {
    9. Boolean doCheck(Info info );//里面是个信息,进行过滤
    10. }

    然后我们再写一个类,继承这个接口,并且重写方法,写出约束的条件

    1. package com.zrl.dao;
    2. import com.zrl.pojo.Info;
    3. /**
    4. * 实现这个接口,需要重写这个方法,同时写约束条件
    5. * @author zjjt
    6. *
    7. */
    8. public class Eg implements Boss{
    9. public Boolean doCheck(Info info) {
    10. String in=info.getInfo();
    11. if(!in.contains("sb")&&!in.contains("¥")) {
    12. return true;
    13. }
    14. in=in.replace("sb", "可爱");//不允许出现sb,出现了就替换成可爱
    15. in=in.replace("¥","~");
    16. info.setInfo(in);
    17. return false;
    18. }
    19. }

    然后写一个单例,里面还写方法

    1. package com.zrl.dao;
    2. /**
    3. * 将Filter组织成一个链条
    4. */
    5. import java.util.ArrayList;
    6. import java.util.List;
    7. import com.zrl.pojo.Info;
    8. public class ShiLi {
    9. private ShiLi() {};
    10. public static List<Boss> list=new ArrayList<Boss>();
    11. public static ShiLi test=new ShiLi();
    12. public static ShiLi getTest() {
    13. return test;
    14. }
    15. public ShiLi addList( Boss b) {
    16. list.add(b);
    17. return this;
    18. }
    19. public Info doChecks(final Info a) {
    20. for(Boss b:list) {
    21. Boolean o=b.doCheck(a);
    22. if(!o) {
    23. return a;
    24. }
    25. }
    26. return a;
    27. }
    28. }

    最后是测试环节

    1. package com.zrl.dao;
    2. import com.zrl.pojo.Info;
    3. public class Test {
    4. public static void main(String[] args) {
    5. Info f=new Info();
    6. f.setInfo("sb,哈哈,你爱¥吗,我爱¥");
    7. ShiLi s=ShiLi.getTest();
    8. s.addList(new Eg()).doChecks(f);
    9. System.out.println(f.getInfo());
    10. }
    11. }

    最后的运行结果如下:

     

    三.🍕🍕观察者模式

    • 观察者模式的概念

    1.观察者模式是对象的行为模式,有时也称为“发布/订阅模式” 或者 “监听模式”,

    2.观察者模式定义了观察者的被观察者之间的关系,让多个观察者对象可以响应一个被观察者对象

    eg:

    1.首先,我们先写一个事件源

    1. package com.gcz.dao;
    2. /**
    3. * 事件源
    4. * @author zjjt
    5. *
    6. */
    7. public abstract class Yuan {
    8. protected Object sum;
    9. public Object getSum() {
    10. return this.sum;
    11. }
    12. }

    2.然后我们在写一个具体的某一件事,

    1. package com.gcz.dao;
    2. /**
    3. * 某一个具体的事件
    4. * @author zjjt
    5. *
    6. */
    7. public class ShiJian extends Yuan{
    8. long timestamp;
    9. public ShiJian(Object sum) {
    10. this.timestamp=System.currentTimeMillis();
    11. this.sum=sum;
    12. }
    13. }

    3.定义一个接口

    1. package com.gcz.dao;
    2. public interface Boss {
    3. void doSoS(ShiJian p);
    4. }

    4.写两个人物和对应的事件

    1. package com.gcz.dao;
    2. public class One implements Boss{
    3. @Override
    4. public void doSoS(ShiJian p) {
    5. System.out.println("我是经理,请问发生什么事了吗?");
    6. }
    7. }

    1. package com.gcz.dao;
    2. public class Two implements Boss{
    3. @Override
    4. public void doSoS(ShiJian p) {
    5. System.out.println("我是导购员,请问有什么可以帮到你吗?");
    6. }
    7. }

    5.使用单例

    1. package com.gcz.dao;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. public class ShiLi {
    5. public static ShiLi s=new ShiLi();
    6. private List<Boss> list=new ArrayList<Boss>();
    7. public void addBoss( Boss b) {
    8. list.add(b);
    9. }
    10. public void ringSoS() {
    11. ShiJian j=new ShiJian(this);
    12. for (Boss boss : list) {
    13. boss.doSoS(j);
    14. }
    15. }
    16. }

    6.最后我们来测试一下

    1. package com.gcz.dao;
    2. public class Test {
    3. public static void main(String[] args) {
    4. ShiLi s= new ShiLi();
    5. s.addBoss(new One());
    6. s.addBoss(new Two());
    7. s.ringSoS();
    8. }
    9. }

    最后是运行结果:

     

    今天的代码到这里就结束啦! 咱们下期见

    今天也要记得微笑呀.

  • 相关阅读:
    【Jlink烧录自动化】一台电脑连接 多个Jlink 用 J-flash批处理程序烧写多个单片机(生产批量烧录)
    hive on tez学习之官网和源码
    权威认可!安全狗获CNVD“漏洞信息报送贡献单位”殊荣
    vue用vite配置代理解决跨域问题(target、rewrite和changeOrigin的使用场景)
    SpringBoot整合数据库连接
    修改bat文件默认编辑软件
    ROS总结理解
    Vue3理解(6)
    从开源项目探讨“FPGA挖矿”的本质
    优先队列题目:数组的最小偏移量
  • 原文地址:https://blog.csdn.net/weixin_65975275/article/details/125397605