Android 设计模式第三篇:模板方法模式

来源:互联网 发布:js 迭代object 编辑:程序博客网 时间:2024/05/13 11:13
Template Method Pattern模板的含义

  所谓模板,有用过VS的朋友会比较熟悉,这个IDE将一些统一的代码编写方法制作成模板加载在IDE里面,开发者可以根据自己制作的模板或者微软提供的模板比如Asp.net 、Winform 、WPF开发等各种模板。而Android 建立项目初期生成的Project 也可以当作是一个模板。它是将原先定义好的东西事先写好了一套规范,具体要如何使用这套规范模板来完成不同的任务,是要看我们的AP开发者不同的实现方法。

  作为模板的方法要定义在父类,而方法的定义中使用到抽象方法。因此如果只看父类部分的程序,根本不知道到底会是怎样处理内容,最多只能了解该如何调用处理抽象方法而已。

  实际实现抽象方法的是子类。要在子类实现方法,才能决定具体的操作。理论上,如果在不同的子类执行不同的实现,应该就能发展出不同的处理内容 。不过无论在哪个子类执行任何一种实现,处理的大致流程都是还要依照父类的制定方式。


程序示例

  此例子定义了三个类一个为抽象类(AbstractDisplay),另外两个为分别实现这个抽象类其中的三个抽象方法,具体的程序示例图见如下:


AbstractDisplay 抽象类

    public abstract class AbstractDisplay {        public abstract String open();        public abstract String print();        public abstract String close();        public final String display() {            StringBuffer sb = new StringBuffer();            sb.append(open());            for (int i = 0; i < 5; i++) {                sb.append(print());            }            sb.append(close());            return sb.toString();        }    }

该类只实现了方法display 方法,并抽象出open(),print(),close()  这三个方法交子类代为实现。

CharDisplay 类

    public class CharDisplay extends AbstractDisplay {        private char ch;        public CharDisplay(char ch) {            this.ch = ch;        }        @Override        public String close() {            // TODO Auto-generated method stub            return ">>";        }        @Override        public String open() {            // TODO Auto-generated method stub            return "<<";        }        @Override        public String print() {            // TODO Auto-generated method stub            return String.valueOf(ch);        }    }

StringDisplay 类

public class StringDisplay extends AbstractDisplay {    public String string;    private int width;    public StringDisplay(String string) {        this.string = string;        this.width=string.length() ;    }    @Override    public String close() {        // TODO Auto-generated method stub        return printLine();    }    @Override    public String open() {        // TODO Auto-generated method stub        return printLine();    }    @Override    public String print() {        // TODO Auto-generated method stub        return "|" + string + "|\n";    }    private String printLine() {        StringBuffer sb = new StringBuffer();                 for (int i = 0; i < width; i++) {            sb.append("*");        }                 return sb.toString()+"\n";    }}

界面处理代码:

public class TemplatePatternActivity extends Activity {    /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                final AbstractDisplay d1=new CharDisplay('H');                final AbstractDisplay d2=new StringDisplay("android pattern");                                Button result=(Button)findViewById(R.id.btn_result);                final EditText et_result=(EditText)findViewById(R.id.result);                result.setOnClickListener(new OnClickListener() {                        @Override            public void onClick(View v) {                // TODO Auto-generated method stub                et_result.setText(d1.display()+"\n"+d2.display());                                            }        });    }}

本文转自: http://www.1000phone.net/thread-6789-1-1.html


原创粉丝点击