設計モード(五)——テンプレート方法モード

5127 ワード

本文はシリーズの文章《設計モード》に属して、文集のリンクを添付します
テンプレートメソッドモード
  • 定義:動作中のアルゴリズムのフレームワークを定義し、いくつかのステップをサブクラスに遅延する.テンプレートメソッドモードにより、サブクラスは、アルゴリズムの構造を変更することなく、アルゴリズムの特定のステップを再定義することができる.
  • の役割:テンプレートメソッドモードを使用することによって、いくつかの複雑なプロセスの実装ステップを一連の基本メソッドにカプセル化することができ、抽象的な親クラスにテンプレートメソッドと呼ばれるメソッドを提供してこれらの基本メソッドの実行順序を定義し、そのサブクラスによっていくつかのステップを上書きすることによって、同じアルゴリズムフレームワークが異なる実行結果をもたらすことができる.
  • は、動作クラスモード
  • である.
    前の例:
    //     
    public abstract class AbstractCarCreater {
        protected void assemblyCar(){
            System.out.println("          ");
        }
        protected abstract void coloring();
        protected abstract void assemblyLogo( );
        public void createrCar(  ){
            assemblyCar();
            this.coloring();
            this.assemblyLogo();
        }
    }
    //     
    public class BenzCarCreater extends AbstractCarCreater{
        @Override
        protected void coloring( ) {
            System.out.println("          ");
        }
        @Override
        protected void assemblyLogo() {
            System.out.println("           Logo");
        }
    }
    //     
    public class BmwCarCreater extends AbstractCarCreater{
        @Override
        protected void coloring() {
            System.out.println("          ");
        }
        @Override
        protected void assemblyLogo() {
            System.out.println("       BMW Logo");
        }
    }
    //    
    public class Client {
        public static void main(String[] args) {
            BenzCarCreater benzCarCreater = new BenzCarCreater();
            benzCarCreater.createrCar();
            System.out.println("-------------------------------------");
            BmwCarCreater bmwCarCreater = new BmwCarCreater();
            bmwCarCreater.createrCar();
        }
    }
    

    上のコードは、抽象テンプレートの中で、私たちはすでにアルゴリズムのフレームワークを決めて、1台の完全な車のアルゴリズムを組み立てて、それからアルゴリズムの中の方法は抽象的で、サブクラスに渡して実現して、1つの1つの字のクラスごとに、1つの異なる実行結果があって、これはテンプレートの方法です.
    拡張
    この拡張は、実は知識点や思想面の拡張ではなく、このいくつかの設計モデルを書いて、唯一プロジェクトで使われているモデルです!!!興奮して爆発する.
    Java s 2 shの開発をしたことがある人も実際に使うべきで、このようなモードだとは知らなかったかもしれませんが、以下は簡単にコードをつけます.
    //              
    public interface BaseDao {
        public Serializable add(T t);
        public void update(T t);
        public void delete(T t);
        public int delete(Serializable id); 
        public T findDataById(Serializable id);
        public List findAllData();
        public List findDataByPage(int pageNum, int pageCount);
        public List findDataByCondition(String conditionName, String conditionValue,String conditionOperation);
    }
    //              
    public abstract class HibernateDao implements BaseDao{
        @Autowired
        private SessionFactory sessionFactory; 
        public SessionFactory getSessionFactory() {
            return sessionFactory;
        }
        public void setSessionFactory(SessionFactory sessionFactory) {
            this.sessionFactory = sessionFactory;
        }
        @Override
        public Serializable add(T t) {
            return sessionFactory.getCurrentSession().save(t);
        }
        @Override
        public void update(T t) {
            sessionFactory.getCurrentSession().update(t);
        }
        @Override
        public int delete(Serializable id) {
            String hql = "delete from "+this.getEntityClass().getSimpleName()+" en where en.id = ?";
            return sessionFactory.getCurrentSession().createQuery(hql).setParameter(0, id).executeUpdate();
        }
        @Override
        public void delete(T t) {
            sessionFactory.getCurrentSession().delete(t);
        }
        @Override
        public T findDataById(Serializable id) {
            return (T) sessionFactory.getCurrentSession().get(getEntityClass(), id);
        }
        @Override
        public List findDataByCondition(String conditionName, String conditionValue, String conditionOperation) {
            String hql = "select en from "+getEntityClass().getSimpleName()+" en where en."+conditionName+" "+conditionOperation+"?";
            return sessionFactory.getCurrentSession().createQuery(hql).setParameter(0, conditionValue).list();
        }
        @Override
        public List findDataByPage(int pageNum, int pageCount) {
            String hql = "from "+getEntityClass().getSimpleName();
            return sessionFactory.getCurrentSession().createQuery(hql).setFirstResult((pageNum-1)*pageCount).setMaxResults(pageCount).list();
        }
        @Override
        public List findAllData() {
            String hql = "from "+getEntityClass().getSimpleName();
            return sessionFactory.getCurrentSession().createQuery(hql).list();
        }
        //     
        protected abstract Class getEntityClass();
    }
    //    dao
    @Repository
    public class BookDao extends HibernateDao{
        @Override
        protected Class getEntityClass() {
            return Book.class;
        }
    }
    

    上のコードはテンプレートメソッドモードを使用しています.BaseDaoでは、汎用制約Beanのタイプを使用して、インタフェースを実現するDaoがあるBeanを操作していることを確認します.そして、その追加削除の変更方法は実際には同じ操作の「アルゴリズム」です.はい、アルゴリズムです.唯一の違いはどこですか.Beanの名前です.したがって、HibernateDaoを使用してBaseDaoを継承し、最終的な方法protected abstract Class getEntityClass();を定義し、この方法によって伝達されたクラスのclass属性を取得し、Beanの名前を取得し、異なるアルゴリズム結果を得ることができます.これは生きたテンプレートモードであり、素晴らしいです.
    以上がテンプレートメソッドモードです.