设计模式 第八章 模板模式、命令模式、访问者模式

# 设计模式 第八章 模板模式、命令模式、访问者模式

前言

	模板模式、命令模式、访问者模式

一、模板模式

1.介绍

在接口中定义一些方法的执行顺序,
子类按需重写这些方法。
行为型模式。

2.代码示例


//接口
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {

	void refresh() throws BeansException, IllegalStateException;
}

	//定义一些模板方法
public abstract class AbstractApplicationContext extends DefaultResourceLoader
		implements ConfigurableApplicationContext {

	@Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			prepareRefresh();
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
			prepareBeanFactory(beanFactory);
			try {
			//钩子方法
			  postProcessBeanFactory(beanFactory);
			  invokeBeanFactoryPostProcessors(beanFactory);
			  registerBeanPostProcessors(beanFactory);
		   	  initMessageSource();
			  initApplicationEventMulticaster();
			  onRefresh();
			  registerListeners();
			  finishBeanFactoryInitialization(beanFactory);
			  finishRefresh();
			}
			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Exception encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}

				destroyBeans();
				cancelRefresh(ex);
				throw ex;
			}

			finally {
					resetCommonCaches();
			}
		}
	}
}



二、命令模式

1.介绍

向某些对象发送请求,但是不关心请求的接受者是谁,
也不知道被请求的操作是哪个。

2.代码示例

//命令接口
@FunctionalInterface
public interface StatementCallback<T> {
    @Nullable
    T doInStatement(Statement var1) throws SQLException, DataAccessException;
}
//实现命令接口,充当接受者
class QueryStatementCallback implements StatementCallback<T>, SqlProvider {
            QueryStatementCallback() {
            }

            @Nullable
            public T doInStatement(Statement stmt) throws SQLException {
                ResultSet rs = null;

                Object var3;
                try {
                    rs = stmt.executeQuery(sql);
                    var3 = rse.extractData(rs);
                } finally {
                    JdbcUtils.closeResultSet(rs);
                }

                return var3;
            }

            public String getSql() {
                return sql;
            }
        }

//命令调用者
public class JdbcTemplate extends JdbcAccessor implements JdbcOperations {

@Nullable
    public <T> T execute(StatementCallback<T> action) throws DataAccessException {
        Assert.notNull(action, "Callback object must not be null");
        Connection con = DataSourceUtils.getConnection(this.obtainDataSource());
        Statement stmt = null;

        Object var11;
        try {
            stmt = con.createStatement();
            this.applyStatementSettings(stmt);
            T result = action.doInStatement(stmt);
            this.handleWarnings(stmt);
            var11 = result;
        } catch (SQLException var9) {
            String sql = getSql(action);
            JdbcUtils.closeStatement(stmt);
            stmt = null;
            DataSourceUtils.releaseConnection(con, this.getDataSource());
            con = null;
            throw this.translateException("StatementCallback", sql, var9);
        } finally {
            JdbcUtils.closeStatement(stmt);
            DataSourceUtils.releaseConnection(con, this.getDataSource());
        }

        return var11;
    }

@Nullable
    public <T> T query(final String sql, final ResultSetExtractor<T> rse) throws DataAccessException {
        Assert.notNull(sql, "SQL must not be null");
        Assert.notNull(rse, "ResultSetExtractor must not be null");
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Executing SQL query [" + sql + "]");
        }
   return this.execute((StatementCallback)(new QueryStatementCallback()));
    }

}

三、访问者模式

1. 介绍

封装一些作用于某种数据结构的元素操作,
可以在不改变数据结构的前提下作用于这些
元素的新操作,解决数据结构和操作耦合性
问,原理是在被访问者类里面加一个对外提
供接待访问者的接口。

2. 代码示例

//抽象的访问者
public abstract class Action {
    public abstract void getMan(Man man);
    public abstract  void getWoman(Woman woman);
}

//访问者实现
public class Fail extends Action {
    
    @Override
    public void getMan(Man man) {
        System.out.println("男人给的评价失败");
    }

    @Override
    public void getWoman(Woman woman) {
        System.out.println("女人给的评价失败");
    }
}

public class Success  extends Action {
    @Override
    public void getMan(Man man) {
        System.out.println("男人给的评价成功");
    }

    @Override
    public void getWoman(Woman woman) {
        System.out.println("女人给的评价成功");
    }
}

//接受一个访问者对象,被访问者
public abstract class Person {

    //提供一个方法让访问者访问
    public abstract void accept(Action action);
}

//被访问者实现
public class Woman  extends Person {
    @Override
    public void accept(Action action) {
        action.getWoman(this);
    }
}

//1.这里我们使用到双分派,即首先在客户端程序中,将具体的状态作为参数传递到Woman中第一次分派
// 2.然后woman类调用作为参数的具体方法中getWoman,同事将自己作为参数传入,完成第二次分派
public class Man extends Person{
    @Override
    public void accept(Action action) {
        action.getMan(this);
    }
}

public class Wait extends Action{
    @Override
    public void getMan(Man man) {
        System.out.println("男人给的评价待定");
    }

    @Override
    public void getWoman(Woman woman) {
        System.out.println("女人给的评价待定");
    }
}

//提供一个高层的接口,允许访问者访问元素
public class ObjectStructure {
    private List<Person> persons = new LinkedList<>();
    public void attach(Person person){
        persons.add(person);
    }

    public void detach(Person person){
        persons.remove(person);
    }

    public void display(Action action){
        for (Person person : persons){
            person.accept(action);
        }
    }
}

public class Client {

    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.attach(new Man());
        objectStructure.attach(new Woman());
        Success success = new Success();
        objectStructure.display(success);

        System.out.println("==============");
        Fail fail = new Fail();
        objectStructure.display(fail);

        System.out.println("==============");
        Wait wait = new Wait();
        objectStructure.display(wait);
    }
}

//结果
男人给的评价成功
女人给的评价成功
==============
男人给的评价失败
女人给的评价失败
==============
男人给的评价待定
女人给的评价待定


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页