常用设计模式:模板方法模式、观察者模式、责任链模式

模板方法模式、观察者模式、责任链模式

模板方法模式

定义:定义一个操作的算法骨架,而将一些步骤延迟到子类中。Template Method 使得子类可以不改变一个算法的结构即可重定义该算法的某些 特定步骤

//定义一个模板
public abstract class AbstractClass {
	//定义模板方法 一些前置步骤或者必要性步骤 有模板方法完成
	public void  operation(){
		System.out.println(" pre ... ");
		System.out.println(" step1 ");
		System.out.println(" step2 ");
		templateMethod();
		// .... 一些后续的步骤也可以有模板方法完成
	}

	//用户的扩展点,不同的用户在该方法做具体的实现
	abstract protected void templateMethod();
}

class SubCalss extends AbstractClass{
	@Override
	protected void templateMethod() {
		System.out.println("SubClass executed . ");
	}
}

class SubCalss1 extends AbstractClass{
	@Override
	protected void templateMethod() {
		System.out.println("SubClass1 executed . ");
	}
}

测试:

public class Test {
    public static void main(String[] args) {
        AbstractClass subCalss = new SubCalss();
        subCalss.operation();
        System.out.println("-----------------");
        AbstractClass subCalss1 = new SubCalss1();
        subCalss1.operation();

    }
}

在这里插入图片描述
应用场景
1.当你想让客户端只扩展算法的特定步骤,而不是整个算法或其结构 时,请使用Template Method模式。
2.当你有几个类包含几乎相同的算法,但有一些细微的差异时,请使用 此模式。

优点:
1.你可以让客户端只覆盖大型算法的某些部分,从而减少算法其他部分 发生的更改对它们的影响。
2.你可以将重复的代码拖放到超类中。

观察者模式

定义:定义了对象之间的一对多依赖,让多个观察者对象同时监听某一个主题对象,当主题对象发生变化时,它的所有依赖者都会收到通知并更新

//定义一个主题
public class Subject {
	private List<Observer> container = new ArrayList<>();

	public void addObserver(Observer observer){
		container.add(observer);
	}
	public void remove(Observer observer){
		container.remove(observer);
	}
	public void notifyAllObserver(Object obj){
		for (Observer item :container) {
			item.update(obj);
		}

	}
}
//定义观察者接口
public interface Observer {
	void update(Object obj);
}
//具体的观察者
public class Task implements Observer{
	@Override
	public void update(Object obj) {
		System.out.println("task receive:"+obj);
	}
}

class Task1 implements Observer{
	@Override
	public void update(Object obj) {
		System.out.println("task1 receive:"+obj);
	}
}

测试:

public class Test {
	public static void main(String[] args) {
		Subject subject = new Subject();
		subject.addObserver(new Task());
		subject.addObserver(new Task1());
		subject.notifyAllObserver("xxxx");
	}
}

在这里插入图片描述
应用场景:
当更改一个对象的状态可能需要更改其他对象,并且实际的对象集事先 未知或动态更改时,请使用观察者模式。

优点:
1.符合开闭原则
2.可以在运行时建立对象之间的关系

责任链模式

定义:为请求创建了一个接收者对象的链。
比如说有一个请求,经过 请求频率、登录认证、访问权限、敏感词过滤等步骤才能传递到后端。
如果把代码都写进一个方法里面

void process{
//	请求频率
//	登录认证
//	访问权限
//	敏感词过滤
...
}

那么后续还要增加 其他认证条件就需要修改process的代码,这样就会影响到请求频率、登录认证、访问权限、敏感词过滤等步骤的代码。同时如果其他地方需要使用到敏感词过滤这个功能,也不能很好的复用。
因此采用责任链模式进行开发

//定义一个请求
class Request{
    //判断是否通过过滤
    private boolean loggedOn;
    private boolean frequentOk;
    private boolean isPermits;
    private boolean containsSensitiveWords;

    private Request(boolean loggedOn, boolean frequentOk, boolean isPermits, boolean containsSensitiveWords) {
        this.loggedOn=loggedOn;
        this.frequentOk=frequentOk;
        this.isPermits=isPermits;
        this.containsSensitiveWords=containsSensitiveWords;
    }
    //构建者模式
    static class RequestBuilder{
        private boolean loggedOn;
        private boolean frequentOk;
        private boolean isPermits;
        private boolean containsSensitiveWords;

        RequestBuilder loggedOn(boolean loggedOn){
            this.loggedOn=loggedOn;
            return this;
        }

        RequestBuilder frequentOk(boolean frequentOk){
            this.frequentOk=frequentOk;
            return this;
        }
        RequestBuilder isPermits(boolean isPermits){
            this.isPermits=isPermits;
            return this;
        }
        RequestBuilder containsSensitiveWords(boolean containsSensitiveWords){
            this.containsSensitiveWords=containsSensitiveWords;
            return this;
        }

        public Request build(){
            Request request=new Request( loggedOn, frequentOk, isPermits, containsSensitiveWords);
            return request;
        }

    }

    public boolean isLoggedOn() {
        return loggedOn;
    }

    public boolean isFrequentOk() {
        return frequentOk;
    }

    public boolean isPermits() {
        return isPermits;
    }

    public boolean isContainsSensitiveWords() {
        return containsSensitiveWords;
    }
}

//定义处理抽象父类
abstract class Handler{
    Handler next;
    public Handler(Handler next) {
        this.next=next;
    }
    public Handler getNext() {
        return next;
    }
    public void setNext(Handler next) {
        this.next=next;
    }
    abstract boolean process(Request request);

}
//具体handler的实现
//请求频率验证
class RequestFrequentHandler extends Handler{
    public RequestFrequentHandler(Handler next) {
        super( next );
    }
    @Override
    boolean process(Request request) {
        System.out.println("访问频率控制.");
        if (request.isFrequentOk()){
              Handler next=getNext();
              if (null==next){
                  return true;
              }
            if (!next.process( request )) {
                return false;
            }else{
                  return true;
            }
        }
        return false;
    }
}
//登录认证
class LoggingHandler extends Handler{

    public LoggingHandler(Handler next) {
        super( next );
    }
    @Override
    boolean process(Request request) {
        System.out.println(" 登录验证");
        if (request.isLoggedOn()){
            Handler next=getNext();
            if (null==next){
                return true;
            }
            if (!next.process( request )) {
                return false;
            }else{
                return true;
            }
        }
        return false;
    }
}

测试:

public class ChainOfResponsibilityTest {
    public static void main(String[] args) {
        Request request=new Request.RequestBuilder().frequentOk( true ).loggedOn( true ).build();
        RequestFrequentHandler requestFrequentHandler=new RequestFrequentHandler( new LoggingHandler( null ) );

        if (requestFrequentHandler.process( request )) {

            System.out.println(" 正常业务处理");
        }else{
            System.out.println(" 访问异常");
        }

    }
}

在这里插入图片描述
应用场景: 一个请求的处理需要多个对象当中的一个或几个协作处理
优点:
1.请求的发送者和接受者解耦
2.可以控制执行顺序
3.符合开闭原则和单一职责原则

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值