抽象类;
(1得1失)得到抽象方法的能力,失去创建实例的能力
某个父类只知道子类可能需要有这些方法,但是不知道具体的实现方式;抽象类和抽象方法能更好的发挥多态
理由:一定发生继承。一定会发生方法的重写();类的多态性体现!
eg:baseFragment:
注意到除了生命周器的抽取外,其中的MainActivitiy 是fragment和所在Activity中组件沟通的重要桥梁!
public abstract class BaseFragment extends Fragment
{
这也是fragment和activity内的组件沟通的重要桥梁
protected MainActivity mainActivity;//上下文
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
mainActivity = (MainActivity) getActivity();//获取fragment所在Activity;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = initView(); //View
return root;
}
/**
* 必须覆盖此方法来完全界面的显示
* @return
*/
public abstract View initView();
/**
* 子类覆盖此方法来完成数据的初始化
*/
public void initData(){
}
/**
* 子类覆盖此方法来完成事件的添加
*/
public void initEvent(){
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
//初始化事件和数据
super.onActivityCreated(savedInstanceState);
initData();//初始化数据
initEvent();//初始化事件
}
}
当界面相似的情况下,我们一可以通过类的方式抽取基类进行简化处理:
例如 Viewpager 中几个相似的View 界面都很相似,我们抽取后只需要 覆写几个方法即可完成不同界面的相似性布局。
eg:
public class BaseTagPage
{
protected MainActivity mainActivity;
protected View root;
protected ImageButton ib_menu;//按钮ib
protected TextView tv_title;
protected FrameLayout fl_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() {
@Override
public 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;
}
}
和上面相比唯一不同的就是子类不可以获取到基类的控件了。 因为子类有自己的布局
接口:
接口;里面只有抽象方法;更彻底的抽取
接口:(不能创建实例,但可以作为,引用类型)
接口只能用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();
}
}