[扫除文盲]利用架构实例分析面向对象的包裹,多态,继承,接口,泛型

恰恰看到园子里有人问那么些难点,心血来潮,整理一番,希望对初学oop的具有支持,同时有通晓不对的迎接指正。

使用Intent在活动间持续(Intent不仅能够指明当前组件想要执行的动作,还是可以够在区别组件之间传递数据)

  1. 框架结构实例基础准备

① 、使用显式Intent

借使大家做二个不难易行的小系统,须要的操作为:

基于安卓入门1的剧情,继续在ActivityTest项目中再成立1个平移。右击com.example.administrator.activitytest包->New->Activity->Empty
Activity,会弹出2个创制活动的对话框,将运动命名为SecondActivity,并勾选Generate
Layout File,给布局文件起名为second_layout,不勾选Launcher
Activity选项,然后点击Finish。

1.管制用户,对用户进行增、删、改(User表)

Android
Studio会自动生成SecondActivity.java和second_layout.xml那四个文件。在second_layout中添加二个按钮Button
2(步骤同前),SecondActivity中的代码自动生成一部分,保持暗中认可不变。

2.管理剧中人物,对角色进行增、删、改(Role表)

AndroidManifest.xml已经注册过活动,打开如下:

3.管理效率,对系统成效拓展增、删、改(Fun表)

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.example.administrator.activitytest">
 4 
 5     <application
 6         android:allowBackup="true"
 7         android:icon="@mipmap/ic_launcher"
 8         android:label="@string/app_name"
 9         android:supportsRtl="true"
10         android:theme="@style/AppTheme">
11         <activity android:name=".MainActivity">
12             <intent-filter>
13                 <action android:name="android.intent.action.MAIN" />
14 
15                 <category android:name="android.intent.category.LAUNCHER" />
16             </intent-filter>
17         </activity>
18         <activity android:name=".SecondActivity"></activity>                //SecondActivity不是主活动,不需要配置<intent-filter>标签里的内容
19     </application>
20 
21 </manifest>

透过可以分析,我们这么些小系统要求的表为,User用户表,Role角色表,Fun权限表,还要派生出一张表
剧中人物-权限(RoleFun) 关联表。个中用户表里面有字段存放剧中人物Role的ID。

修改安卓入门第11中学的MainActivity中的按钮点击事件,在MainActivity这些运动的底子上打开SecondActivity这么些运动,代码如下:

图片 1

1    button1.setOnClickListener(new View.OnClickListener(){
2         @Override
3         public void onClick(View v){
4             Intent intent=new Intent(MainActivity.this,SecondActivity.class);  //第一个参数Context要求提供一个启动活动的上下文,第二个参数Class指定想要启动的目标活动        
5             startActivity(intent);                                             //startActivity()用于启动活动
6         } 
7    });

图片 2

再也运维程序,在MainActivity界面点击按钮成功运转SecondActivity那一个活动。

  1. 搭建项目基础框架

贰 、使用隐式Intent(并不指明大家想要运营哪2个运动,而是钦点了一多级更为抽象的action和category等音讯,然后交由系统去分析那么些Intent并找出适合的位移去运营)

相似景色下,大家都利用的是3层架构方式,就算是良莠不齐情势也是在此基础上延伸的。

AndroidManifest.xml下,在<activity>标签下安顿<intent-filter>的内容,能够内定当前运动能够响应的action和category。唯有<action>和<category>中的内容还要可以合营上Intent中钦赐的action和category时,那一个活动才能响应该Intent。

图片 3

1  <activity android:name=".SecondActivity">
2       <intent-filter>
3             <action android:name="com.example.administrator.activitytest.ACTION_START"/>
4 
5             <category android:name="android.intent.category.DEFAULT"/>
6       </intent-filter>
7  </activity>

地点那幅图是最最基础的贰个框架。总共分为八个层次,Model层,DAL层,BLL层,Tools层,UI层

修改MainActivity中按钮的点击事件,代码如下:

  1. 代码完毕基础架构
1    button1.setOnClickListener(new View.OnClickListener(){
2        @Override
3        public void onClick(View v){
4             Intent intent=new Intent("com.example.administrator.activitytest.ACTION_START");
5             startActivity(intent);
6        }
7    });

对于一般的编程者来说,实现起来并不复杂,或然不会将那么多的沉思应用到实例中来,那么那里我们模拟下,先抛开这几个考虑。

重国民党的新生活运动行程序,在MainActivity界面点击按钮成功运行SecondActivity那个运动(打开自个儿程序内的移位)。

(1)首先每一个数据库表对应二个Model类这些是必须的呢,那么我们在Model层新建陆个类,User,Role,RoleFun,Fun

 2.1施用隐式Intent,也得以运营别的程序的移位,比方调用系统的浏览器来打开网页。

(2)这么些八个指标都亟待数据库增、删、改操作,那么大家在DAL里面对应的创造陆个类,UserDAL,RoleDAL,RoleFunDAL,FunDAL,然后每一个类里面写入相同的章程,增、删、改。

修改MainActivity中按钮点击事件的代码,如下:

       Insert(对象),Delete(对象),Update(对象)

1    button1.setOnClickListener(new View.OnClickListener(){
2          @Override
3          public void onClick(View v){
4               Intent intent=new Intent(Intent.ACTION_VIEW);
5               intent.setData(Uri.parse("http://www.baidu.com"));                  //将网址字符串解析为Uri对象,再调用setData()方法将这个Uri对象传递进去
6               startActivity(intent);
7          }
8    });

       那里您也许曾经意识到问题了,hold,继续看。

重国民党的新生活运动行程序,在MainActivity界面点击按钮成功运转系统浏览器。

(3)同样在BLL层要贯彻对DAL的调用,须求树立平等的几个事情操作类,UserMgr,RoleMgr,RoleFunMgr,FunMgr,各类类里面落成均等的调用方法。

(4)Tools暂不考虑,主要存放平时用的类

(5)UI层,表现层,可以是Web或者Winform等形式

搭建好的代码框架如下:

图片 4

  1. 开首OOP的解析利用–封装

面向对象的第二个特征是:封装,其实大家早就落到实处了,分层就是包装的最佳反映,各层相互调用,“低耦合,高内聚”

那里不在解释封装了。

  1. OOP–继承

透过上边的代码编写你一定遇见了不幸了,当随着大家业务效率的不断增多,我们的DAL和BLL类更加多,越来越难管理了。

更悲催的是,借使每一种实体类作者想完毕一个查询(Search)操作,那么须求在重重的类里面实现那个Search代码,试想那是何其的人言可畏,你的价值全体荒废在了根基代码的编写上。

怎么样消除那几个题材吗?

那就是应用继承的想想贯彻,父子类来落到实处,贰个国有的父类(BASE),全部子类继承这么些子类,那么子类也就具备了父类的public方法,假使必要追加公家的不二法门,只需求在父类中添加方法即可兑现,全体子类自动会三番九回。

图片 5

格局如上海体育场合所示,这样完成二个Search()方法,大家只必要变更BaseDAL类即可,而别的实体类都不要求动了。试想对若干实体类的体系,这意思想是多么的基本点,能够节约多量的岁月。

还从未截至,细心的你只怕发现,大家的Insert,Update,Delete都亟需团结的Model呀,那BaseDAL应该什么得以实现啊?怎么知道具体的章程去调用具体的Model呢?

哈哈,这里C#提议了引以为豪的“泛型”思想。通过泛型,能够轻松的化解那么些标题。

  1. 泛型

对于BaseDAL大家得以设计改为泛型的类,在采用该类的时候需求将此类具体的实例化,看代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAL
{
    public class BaseDAL<T> where T:new ()
    {
        public bool Insert(T t)
        {
            //TODO 解析T,通过反向工程构造SQL
            return true;
        }

        public bool Update(T t)
        {
            //TODO 解析T,通过反向工程构造SQL
            return true;
        }

        public bool Delete(T t)
        {
            //TODO 解析T,通过反向工程构造SQL
            return true;
        }
    }
}

 那样,我们任何的类能够一向接轨父类了。但为了完整架构的可塑行,大家DAL层将不做对BaseDAL的接轨操作,原因很粗大略,因为大家也许会切换DAL的技术,例如由ADO.Net切换来HNibernate等,同时DAL作为数据操作层尽量要保全简约。

我们那边在作业逻辑层BLL来贯彻两次三番,同样也急需二个BaseBLL的基类。

 

using DAL;
using System.Collections;
using System.Collections.Generic;

namespace BLL
{
    public class BaseMgr<T> where T : new()
    {
        //可以重写
        public virtual bool Insert(T t)
        {
            return new BaseDAL<T>().Insert(t);
        }

        public bool Update(T t)
        {
            return new BaseDAL<T>().Update(t);
        }

        public bool Delete(T t)
        {
            return new BaseDAL<T>().Delete(t);
        }
        //重载
        public bool Delete(List<T> list)
        {
            return true;
        }
    }
}

 

接下来实际的实体类继承这些BaseMgr

using Model;

namespace BLL
{
    public class UserMgr : BaseMgr<User> //继承
    {
        //继承基类最大的好处是,可以写本类自己的特有方法
        //例如User,我想获取所有的用户,而其他的业务逻辑不需要实现这个方法,
        //那么我们可以单独写在这个类里面
        //当然你也可以写在BaseMgr里面,哪样所有的子类都具有这个方法了

        //可以对基类进行重写(多态)
        public override bool Insert(User t)
        {
            return true;
        }

        //继承基类前的代码
        //public bool Insert(User t)
        //{
        //    return new UserDAL().Insert(t);
        //}

        //public bool Delete(User t)
        //{
        //    return new UserDAL().Delete(t);
        //}

        //public bool Update(User t)
        //{
        //    return new UserDAL().Update(t);
        //}


    }
}

 

由此泛型达成持续大家得到的最大益处:

1,数据库每扩展三个实体,代码的Model层只必要增添三个相应的实体类,那么该类的根基操作随即产生了(即,BaseDAL类的全部办法)

2,通过在业务层对基类的接续,能够达成特有方法,当然并不是兼具的实体类都亟待后续,具体看本身的须要

  1. OOP-多态

多态性(polymorphisn)是同意你将父对象设置成为和二个或越来越多的她的子对象相等的技艺,赋值之后,父对象就足以依照当前赋值给它的子对象的天性以分化的法子运维。一句话来说,正是一句话:允许将子类类型的指针赋值给父类类型的指针。

落到实处多态,有三种艺术,覆盖,重载。

覆盖:override,上边代码UserMgr类中的Insert方法正是用的覆盖措施,可以重写父类的有些方法来完结本人的政工要求。必然要小心将允许重写的主意事先申明为virtual

重载:通俗点就是1个艺术名,差别的参数类型,例如作者想达成二个批量剔除功效,方法的名字同样想起名为Delete,那么只须要变更参数即可

         public bool Delete(List<T>
listT);

 

  1. 接口

顾名思义,接口,即插即用,例如插座,只要有对应插头,插入即可使用了。

接口:在编制程序里面起到的是一种标准,既然是明媒正娶,必定是束缚若干人的,也正是集团开发品种,大家共同服从1个业内,协调开发代码,而且互不烦扰。

接口愈来愈多的是被软件架构师使用,设计好全体的软件架构,直接提交程序员开发即可,程序员只要求依照那种专业做就足以了,对种种接口举行实际的达成。

在意哦:接口不落到实处,是足以因而编写翻译的啊

 

  1. 引申架构

由此使用地方的思考,基本上我们能够兑现一套牢固的架构了,而且能够复用到其它的系统中。

但技术是在时时刻刻兴利除弊的,而且须要也是连连变更的,更可怕的是能够运维系统的设备进而多了,从PC到一般手提式有线电电话机,再到智能手提式有线电电话机(Android,IOS,WP7),再到机械电脑等等。

再有语言的差距,Java,php等等

那就供给一套架构不但要结实,更可以适用于种种平台的开销。

为此大家的架构能够引申成多个劳务,将地方的架构在累加三个服务层(可以用WCF,能够用MVC4的WebAPI,Restful规范),那么全部的架构正是底下那一个样子了。

图片 6

 

  1. 总结

软件开发其实就是一种思维,将人的一种思想通过代码格局反映出去。好好用心理考,你就知晓为啥会那样做,仔细回味个中的妙处。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图