• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
 






高煥堂.EIT

 
 

Powered by 博客园
博客园 | 首页 | 新随笔 | 联系 | 订阅 订阅 | 管理

好莱坞(Hollywood)原则的演练

By 高煥堂

 

好莱坞(Hollywood)原则的演练

 

1. 前言

     在上一篇文章<<框架开发:好莱坞(Hollywood)大明星原则>>里,提到了:由于要等客户出现才能决定轮胎,所以客户到来之前,先不做轮胎。于是,框架设计的时间轴为:

 

 图1  汽车需求知识获得的时间轴

    于是,把轮胎部分去掉,先不做轮胎,而得出「汽车轮盘」(或「轮毂」),如下图所示: 

 

图2  挖掉轮胎之后,先做部分就是框架了

 

2. 演练

<<演练一>>

       此例子是一个简单的应用程序,只做1+2+3+ … + N的值而已。依据框架设计时间轴:

 

  图3  框架的知识获得时间表(Ex.1)

    从上图可知:

  • 先做算法部分,所以强龙可将算法(1+2+3+… +N)撰写于框架的基类里。
  • N值部份留给AP开发者决定,所以地头蛇可N值撰写于应用子类里。 

       于是,此框架的设计图如下: 

  

   图4  框架的设计图(Ex.1)

       其中,先做部分就是框架部份;而先不做部分则是AP部分。强龙先做框架部份,以Java撰写框架部份的代码(引擎是框架的一部分),如下: 

// 引擎部份

public class Calculator {

         private Count ref;

         public int run() {

            int n = getN();

            int sum = 0;

            for(int i=0; i<=n; i++)  sum += i;

            return sum;

          }

          private int getN() {    return ref.getCount();    }

          public void setRef(Count co){    ref = co;     }

}

//框架部份

package Framework;

public abstract class Count {

         public int getCount() {

               int cc = onCount();

               return cc;

        }

        protected abstract int onCount();

}

[歡迎光臨 高煥堂 網頁: http://www.cnblogs.com/myEIT/ ]

<<演练二>>

     如果时间轴改为:

 

 图5  框架的知识获得时间表(Ex.2)

     修改设计图为:

 

  图6  框架的设计图(Ex.2)

  实现代码如下: 

//框架部份

package Engine;

import Framework.Count;

public class Calculator {

         private Count ref;

         public int run() {

             return ref.calculate();

       }

         public void setRef(Count co){

              ref = co;

        }

} 

//---------------------------------------------------- 

package Framework;

public abstract class Count {

         public int calculate(){

                 int N = getCount();

                 return onCal(N);

         }

         public int getCount() {

               return 10;

        }

        protected abstract int onCal(int k);

}

//应用部分

import Framework.Count;

public class myCount extends Count{

        protected int onCal(int N){

                    int sum = 0;

                    for(int i=0; i<=N; i++) {

                        sum += i;

                     }

                    return sum;

        }

}

// ------------------------------------------------------------- 

import Engine.Calculator;

import Framework.Count;

public class JMain {

        public static void main(String[] args) {

                Calculator cal = new Calculator();

                Count co = new myCount();

                cal.setRef(co);

                System.out.println(cal.run());

        }

}

  

当客户需要计算:

       1^1 + 2^2 + … + N^N时候,

可撰写应用子类如下:

import Framework.Count;

public class myCount _2 extends Count{

        protected int onCal(int N){

                    int sum = 0;

                    for(int i=0; i<=N; i++) {    sum += i*i;    }

                    return sum;

        }}

 

<<演练三>>

      如果时间轴改为:

 

  图7  框架的知识获得时间表(Ex.3)

       修改设计图为:

 

   图8  框架的设计图(Ex.3)

   实现代码如下:

// 框架部份

package Framework;

public abstract class Count {

         public int calculate(){

                 int N = getCount();

                 int sum = 0;

                    for(int i=0; i<=N; i++)  sum += onItem(i);

                    return sum;

         }

         public int getCount() {   return 10;   }

        protected abstract int onItem(int k);

}

 

//应用子类部份

import Framework.Count;

public class myCount extends Count{

        protected int onItem(int k){

                    return k;

        }

}

 

框架提供Default 行为:

// 父类部份

package Framework;

public abstract class Count {

         public int calculate(){

                 int N = getCount();

                 int sum = 0;

                    for(int i=0; i<=N; i++) {

                        sum += onItem(i);

                     }

                    return sum;

         }

         public int getCount() {  return 10;    }

        protected int onItem(int k) {         return k;  }

}

// 应用子类

import Framework.Count;

public class myCount extends Count {}

 

<<演练四>>

如果时间轴改为:

 

  图9  框架的知识获得时间表(Ex.4)

  设计图更改为:

 

  图10  框架的设计图(Ex.4)

 

撰写如下的Android代码:

// 框架部份

package Engine;

import Framework.Count;

 

public class Calculator {

         private Count ref;

         public int run() {

             return ref.calculate();

       }

         public void setRef(Count co){

              ref = co;

        }

} 

//----------------------------------------------- 

package Framework;

public abstract class Count {

         public int calculate(){

                 int N = getCount();

                 int sum = 0;

                    for(int i=0; i<=N; i++) {

                        sum += onItem(i);

                     }

                    return sum;

         }

         public int getCount() {

               return onCount();

        }

        protected abstract int onCount();

        protected abstract int onItem(int k);

}

// AP部分

package com.misoo.ppxx;

import Framework.Count;

public class myCount extends Count{

        protected int onCount(){

                return myActivity.mN;

        }

        @Override

        protected int onItem(int k) {

                return k;

        }

} 

//----------------------------------------------------------- 

package com.misoo.ppxx;

import Engine.Calculator;

import Framework.Count;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

import android.widget.LinearLayout;

 

public class myActivity extends Activity implements OnClickListener {

        private Button btn, btn2;

        private EditText et;

        public static int mN;

       @Override

       public void onCreate(Bundle savedInstanceState) {

           super.onCreate(savedInstanceState);

           setContentView(R.layout.main);

            LinearLayout layout = new LinearLayout(this);

            layout.setOrientation(LinearLayout.VERTICAL);

            LinearLayout.LayoutParams param =

                     new LinearLayout.LayoutParams(100, 55);

            param.leftMargin = 1;                 param.topMargin = 3;

            et = new EditText(this);            et.setId(100);

            et.setOnClickListener(this);

            layout.addView(et, param);       

            btn = new Button(this);            btn.setId(101);

            btn.setText("Run");                    btn.setOnClickListener(this);

            btn.setBackgroundResource(R.drawable.x_jude);

            layout.addView(btn, param);

       

            btn2 = new Button(this);           btn2.setId(102);

            btn2.setText("Exit");                   btn2.setOnClickListener(this);

             btn2.setBackgroundResource(R.drawable.x_sky);

             layout.addView(btn2, param);

             setContentView(layout);

     }

    public void onClick(View v) {

            switch(v.getId()) {

            case 100:

                        String ss = et.getText().toString();

                        mN = Integer.parseInt(ss);

                        setTitle(ss);

                        break;

            case 101:

                     Calculator cal = new Calculator();

                     Count co = new myCount();

                     cal.setRef(co);

                     int result;

                     result = cal.run();

                     setTitle(String.valueOf(result));

                     break;

                case 102:

                        finish();       break;

                }

        }

   }

~ END ~

[Go Back]

 

发表于 2013-11-01 23:01  高煥堂.EIT  阅读(346)  评论(0)    收藏  举报
 
刷新页面返回顶部