抽象类与接口及简单的工厂模式

来源:互联网 发布:测量图片尺寸软件 编辑:程序博客网 时间:2024/04/30 20:56

抽象类;

(1得1失)得到抽象方法的能力,失去创建实例的能力

某个父类只知道子类可能需要有这些方法,但是不知道具体的实现方式;
抽象类和抽象方法能更好的发挥多态
理由:一定发生继承。一定会发生方法的重写();类的多态性体现!

eg:baseFragment:

注意到除了生命周器的抽取外,其中的MainActivitiy 是fragment和所在Activity中组件沟通的重要桥梁!

public abstract class BaseFragment extends Fragment{       这也是fragment和activity内的组件沟通的重要桥梁protected MainActivity mainActivity;//上下文@Overridepublic void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);mainActivity = (MainActivity) getActivity();//获取fragment所在Activity;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View root = initView(); //Viewreturn root;}/** * 必须覆盖此方法来完全界面的显示 * @return */public abstract View initView();/** * 子类覆盖此方法来完成数据的初始化 */public void initData(){}/** * 子类覆盖此方法来完成事件的添加 */public void initEvent(){}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {//初始化事件和数据super.onActivityCreated(savedInstanceState);initData();//初始化数据initEvent();//初始化事件}}

当界面相似的情况下,我们一可以通过类的方式抽取基类进行简化处理:

例如  Viewpager 中几个相似的View 界面都很相似,我们抽取后只需要 覆写几个方法即可完成不同界面的相似性布局。

eg:

public class BaseTagPage{protected MainActivity mainActivity;protected Viewroot;protected ImageButtonib_menu;//按钮ibprotected TextViewtv_title;protected FrameLayoutfl_content;protected ImageButton ib_listOrGrid;public BaseTagPage(MainActivity context){this.mainActivity = context;initView();//初始化布局initEvent();}public  void initView() {//界面的根布局root = View.inflate(mainActivity, R.layout.fragment_content_base_content, null);ib_menu = (ImageButton) root.findViewById(R.id.ib_base_content_menu);tv_title = (TextView) root.findViewById(R.id.tv_base_content_title);fl_content = (FrameLayout) root.findViewById(R.id.fl_base_content_tag);ib_listOrGrid = (ImageButton) root.findViewById(R.id.ib_base_content_listorgrid);}public void initEvent(){//给菜单按钮添加点击事件ib_menu.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//打开或者关闭左侧菜单mainActivity.getSlidingMenu().toggle();//左侧菜单的开关}});}/** * 此方法在该页面数据显示的时候再调用 */public void initData(){}public View getRoot(){return root;}}

当子类继承父类是 直接在initview()中修改控件的属性。

重写事件和数据的方法即可! 

采用上面方式抽取时要注意 initdata 的调用 大多数 会在从 结合取出之前先行初始化,例如从构造函数中传递 一个集合,下面可能会用到 ,所以设置了空引用。

这是 初始化可以避免引用为空!!


普通定义界面抽取类:
当布局完全不同,完全自定义,甚至后面还是需要自定义布局模块的情况下,可以采用下面这种基类抽取方式:
public abstract class BaseCenterPaper {    private View root ;    MainActivity mainActivity;    public BaseCenterPaper(Context context) {        this.mainActivity= (MainActivity)context;        this.root=initView();        initEvent();    }    public abstract View initView();    public void initData(){    }    public void initEvent(){    }    public View getRoot() {        return root;    }}
和上面相比唯一不同的就是子类不可以获取到基类的控件了。 因为子类有自己的布局

而 所需要的数据  可以在构造函数中进行传递。 然后将数据初始化给所继承的子类 !取出这个实例时提前调用initdata方法


接口:

接口;里面只有抽象方法;更彻底的抽取
接口:(不能创建实例,但可以作为,引用类型)
接口只能用public 或者默认修饰符修饰。
在接口中常量默认的修饰符是public static final
当接口作为引用类型引用,接口的实现类时,体现出接口的多态性!


eg: interface Product{     int getProduceLine();}class Printer implent Product{   int  getProduceLine(){       syso.printf("line")  }}class client{  public void main (String[] args){     Product p=new Printer();     p.getProduceLine(); }}


这里将多态的第1个必要条件,必须要有继承替换成了,实现接口。

简单的工厂模式:

面向接口编程:
实现低耦合,高内聚的一种编程方法
简单的工厂模式(情景A使用B对象,为了减少A对象对B对象的耦合,和B对象的替换,不采用组合方式而是采用工厂模式):
思路:
B对象即被使用的对象是一个接口。将需要使用的对象B,放在使用者构造函数中,并在内部对其使用。
当A对象需要使用B对象时,通过工厂产生一个接口放入B对象中。由于接口的标准是相同的,
替换B对象只需要C对象实现接口并在工厂中返回C对象即可,A的内部不用进行任何改变

eg:A为电脑 B为打印机 C为另一种打印机interface Output {   public void output();} 因为接口的存在使得Computer使用打印机的方式完全透明(因为方法规范)。class Computer {   private Output o;    public computer(Output output)    {     this.output=output;    }    public void print(){     o.output();}} class Aoutput implentment Output(){   public output(){         syso.printf("a的打印方式");     }       }class Factory{    getOutput() {         return new Aoutput();//如需替换A则只需要在工厂返回时替换A对象为C对象即可     }    public void main(String[] args)    {      Factory factory=new Factory();           Computer c=new computer(factory.getOutput());      c.output();    }}


0 0
原创粉丝点击