翻译TIPatterns--分解共同性(Factoring Commonality)

博客介绍了JDK里Strategy模式例子,指出Policy模式是泛化的Strategy模式,能处理对象多个方法独立变化,比Strategy模式更灵活。还阐述了Template Method,它是应用程序框架基本概念,在基类定义且常为final,通过调用基类方法驱动程序,并给出示例及相关练习。

分解共同性(Factoring Commonality)


    应用“一次且只能有一次” 原则产生最基本的模式,将变化的那部分代码放到方法里。这可以用两种方法来表达:


策略模式(Strategy):运行时刻选择算法

    另外,Strategy模式还可以添加一个“上下文(context)”,这个context可以是一个代理类(surrogate class),用来控制对某个特定strategy对象的选择和使用。


//: strategy:StrategyPattern.java

package strategy;

import com.bruceeckel.util.*; // Arrays2.toString()

import junit.framework.*;

 

// The strategy interface:

interface FindMinima {

 // Line is a sequence of points:

 double[] algorithm(double[] line);

}

 

// The various strategies:

class LeastSquares implements FindMinima {

 public double[] algorithm(double[] line) {

  return new double[] { 1.1, 2.2 }; // Dummy

 }

}

 

class NewtonsMethod implements FindMinima {

 public double[] algorithm(double[] line) {

  return new double[] { 3.3, 4.4 }; // Dummy

 }

}

 

class Bisection implements FindMinima {

 public double[] algorithm(double[] line) {

  return new double[] { 5.5, 6.6 }; // Dummy

 }

}

 

class ConjugateGradient implements FindMinima {

 public double[] algorithm(double[] line) {

  return new double[] { 3.3, 4.4 }; // Dummy

 }

}

 

// The "Context" controls the strategy:

class MinimaSolver {

 private FindMinima strategy;

 public MinimaSolver(FindMinima strat) {

  strategy = strat;

 }

 double[] minima(double[] line) {

  return strategy.algorithm(line);

 }

 void changeAlgorithm(FindMinima newAlgorithm) {

  strategy = newAlgorithm;

 }

}

 

public class StrategyPattern extends TestCase  {

 MinimaSolver solver =

  new MinimaSolver(new LeastSquares());

 double[] line = {

  1.0, 2.0, 1.0, 2.0, -1.0,

   3.0, 4.0, 5.0, 4.0 };

  public void test() {

   System.out.println(

    Arrays2.toString(solver.minima(line)));

   solver.changeAlgorithm(new Bisection());

   System.out.println(

    Arrays2.toString(solver.minima(line)));

  }

  public static void main(String args[]) {

   junit.textui.TestRunner.run(StrategyPattern.class);

  }

} ///:~


    请注意模板方法(template method)模式和strategy模式的相似性-template method最显著的特征是它有多个方法需要调用, 它是分段的实现某个功能。但是,这并不是说strategy对象就不能有多个方法调用;考虑Shalloway给出的的订单处理系统的例子,每一个strategy包含不同的国别信息。(此处的Shalloway指《Design Patterns Explained》的作者Alan Shalloway)

    JDK里Strategy模式的例子:comparator objects.

 


Policy模式:泛化的strategy模式
    尽管GoF说Policy模式只是Strategy模式的一个别名,但是他们给出的Strategy模式的例子隐含的假定了strategy对象只使用一个方法――也就是说假定你已经把可能变化的算法拆成了一段单独的代码。
    其他人(指 Shalloway, Design Patterns Explained, and Alexandrescu, Advanced C++ Design )用Policy模式来表示一个对象有多个方法的情况,对于不同的类,这些方法可能相互独立变化。相对于(Strategy模式) 只能有一个方法而言,Policy模式具有更大的灵活性。
    例如,当某个产品需要被运送到不同国家的时候,与该产品相关的海运政策(shipping policy)可以被用来说明一些与运输有关的问题。这些问题可能包括运输方式,如何计算邮资或者运费,客户需求以及费用,特殊处理的费用等等。所有这些东西可能会互不相干的变化,而且很重要的一点是在运输过程中你可能会在不同地点(points)需要上述信息。(外贸专业词汇不懂 )

    通常情况下,把Strategy模式和Policy模式区别开来是很有好处的,用Strategy模式处理一个方法(变化)的情况,而用Policy模式处理多个方法。

 

模板方法(Template method)

    应用程序框架使你可以从一个或者一系列类继承下来,进而创建一个新的应用程序,你可以重用既有类的大多数代码并且按照你自己的需要覆写其中的某些方法,从而实现应用程序的定制。Template Method是应用程序框架的一个基本概念,它通常隐藏在(框架)背后,通过调用基类的一组方法(有些方法你可能已经覆写过了)来驱动应用程序。

    比如,当创建一个applet的时候你就已经在使用应用程序框架了:你从Japplet继承下来,然后重载init()方法。Applet机制(实际上就是template method)完成剩下的工作,比如屏幕显示,处理事件循环,调整大小等等。

    Template Method的一个重要特征是:它是在基类里定义的,而且不能够被(派生类)更改。有时候它是私有方法(private method),但实际上它经常被声明为final。它通过调用其它的基类方法(覆写过的)来工作,但它经常是作为初始化过程的一部分被调用的,这样就没必要让客户端程序员能够直接调用它了。

//: templatemethod:TemplateMethod.java

// Simple demonstration of Template Method.

package templatemethod;

import junit.framework.*;

 

abstract class ApplicationFramework {

 public ApplicationFramework() {

  templateMethod(); // Dangerous!

 }

 abstract void customize1();

 abstract void customize2();

 final void templateMethod() {

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

   customize1();

   customize2();

  }

 }

}

 

// Create a new "application":

class MyApp extends ApplicationFramework {

 void customize1() {

  System.out.print("Hello ");

 }

 void customize2() {

  System.out.println("World!");

 }

}

 

public class TemplateMethod extends TestCase  {

 MyApp app = new MyApp();

 public void test() {

  // The MyApp constructor does all the work.

  // This just makes sure it will complete

  // without throwing an exception.

 }

 public static void main(String args[]) {

  junit.textui.TestRunner.run(TemplateMethod.class);

 }

} ///:~

 


    基类的构造函数负责完成必要的初始化和启动应用程序“引擎”(template method)(在一个图形用户界面(GUI)程序里,这个“引擎”通常是“主事件循环(main event loop)”)。客户端程序员只需简单的提供customize1( ) 和 customize2( )方法的定义,整个程序就可以跑起来了。

练习
1. 写一个框架,从命令行读入一系列文件名。打开除最后一个文件的所有文件,用于读入;打开最后一个文件用于写入。框架用待定的策略(policy)处理输入文件,并将输出结果写入到最后一个文件。继承这个框架,定制两个不同的应用程序。
    a. 把每个(输入)文件的文本转换为大写字母。
    b. 用第一个文件给出的单词搜索(输入)文件。

 

目录

 

下载前可以先看下教程 https://pan.quark.cn/s/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有一个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是一种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装和调试应用程序。 提供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是一个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是一款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比一般用户以及程序更高的权限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由和构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值