当前位置:  编程技术>软件工程/软件设计
本页文章导读:
    ▪结合例子理解适配器模式      适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 书本上给出了一个很好的例子:NBA里面,姚明是.........
    ▪RBAC基于角色的权限控制个人理解      基本上搞过it的都知道权限控制其实是很麻烦的一件事情,但是不难理解。在我学习rbac之前,对权限的理解基本上就是权限分配给角色,角色又分配给用户组,然后用户可以属于用户组之类的.........
    ▪SVN 中trunk、tags、branches使用        简介 我们都知道SVN是管理项目源代码的软件,可以把我们开发中的各个阶段的代码记录下来,供我们以后来使用,那么SVN具体的结构你是否知道呢?下面我们来介绍一下它的基本结构 .........

[1]结合例子理解适配器模式
    来源: 互联网  发布时间: 2013-10-30

适配器模式:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。


书本上给出了一个很好的例子:NBA里面,姚明是一个外籍中锋,他和其他成员的语言不通,那么他就需要翻译者来“适配”他,最终使得他能够很其他的成员一起打球(这里讲到的主要是对象适配器)


模式中的成员:

 目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

需要适配的类(Adaptee):需要适配的类或适配者类。

适配器(Adapter):通过包装一个需要适配的对象,把原接口转换成目标接口。

 

例子中的成员:

球员—Target:具有同一种语言的球员

翻译者-Adapter:将外籍中锋的语言进行翻译,使得外籍中锋能够理解球员类的语言

外籍中锋-Adaptee:和球员们的语言不同,需要翻译者


图中可以看出每个球员都可以接受教练的两个命令,但是外籍中锋能够理解的语言和其他的球员不同,所以需要翻译者的翻译

代码

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

namespace 适配器模式
{
    //球员的抽象类
    //包括球员的名字 进攻方法 防守方法
   public abstract  class Player
    {
       //名字属性
       //设置的name修饰符是protected 在抽象类及其子类中可以访问
       //如果设置成为private那么在任何其他的类中都不可以访问
        /********************
         * 这里遇到了两种情况
         * 一种就是下面这种情况--变量设置成为protected类型,通过构造函数来设置变量
         * 另外一种是: 变量设置为private 那么就要通过属性的方法来设置变量
        *********************/
        protected  string name;
        public Player(string name)
        {
            this.name = name;
        }

       //在子类中重写
       //进攻方法
        public abstract void Attack();
       //防守方法
        public abstract void Defense();
           
    }
}

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

namespace 适配器模式
{
    //翻译者继承了球员
    //需要将教练的命令翻译成外籍中锋能够听懂的语言
    //在客户端翻译者是直接和外籍交流的人
    class Translator:Player 
    {

        //如何进行翻译工作
        //首先:实例化一个外籍中锋对象
        ForeignCenter wjzf = new ForeignCenter();

        //然后:初始化外籍中锋的名字
        public Translator(string name)
            : base(name)
        {      
            //通过翻译者给外籍中锋设置名字(注意:没有初始化翻译者的名字)
            wjzf.Name = name;
            //省略代码:this.name = name;
        }

        //最后:进行翻译工作--重写球员的方法
        //如何实现:调用外籍中锋的方法--也就是说翻译者将attack和defense翻译给了外籍球员;使得外籍球员在听到attack和defense知道调用哪种方法
        public override void Attack()
        {
            wjzf.进攻();
        }
        public override void Defense()
        {
            wjzf.防守();
        }
    }
}

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

namespace 适配器模式
{
    //外籍中锋(有语言上的差异)
    //并不能懂得attack  defense命令
    //只能懂得 进攻 防守命令
    class ForeignCenter
    {
        //设置名字
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        //进攻和防守方法-
        //和前面的不同:方法的名字是中文
        public void 进攻()
        {
            Console.WriteLine("外籍中锋 {0} 进攻",name);
        }

        public void 防守()
        {
            Console.WriteLine("外籍中锋 {0} 防守",name);
        }
    }
}

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

namespace 适配器模式
{
    //前锋
    class Forwards:Player
    {
        //构造函数继承父类
        public Forwards(string name)
            : base(name)
        {
        }

        //在子类中重写进攻和防守两个方法
        public override void Attack()
        {
            Console.WriteLine("前锋 {0}进攻",name);
        }

        public override void Defense()
        {
            Console.WriteLine("前锋 {0}防守",name);
        }
    }
}

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

namespace 适配器模式
{
    //后卫
    class Guards:Player 
    {
        //构造函数继承父类
        public Guards(string name)
            : base(name)
        {
        }

        //在子类中重写进攻和防守两个方法
        public override void Attack()
        {
            Console.WriteLine("后卫 {0}进攻",name);
        }

        public override void Defense()
        {
            Console.WriteLine("后卫 {0}防守",name);
        }
    }
}
客户端代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 适配器模式
{
    class Program
    {
        static void Main(string[] args)
        {
           
            Player xm = new Forwards("小明");
            Player xmm = new Center("小明明");
            xm.Attack();
            xmm.Defense();

            //翻译者完全替代了外籍中锋--翻译者直接和教练交流
            //实例化姚明这个外籍中锋利用的是翻译者类
            Player ym = new Translator("姚明");
            ym.Attack();
            ym.Defense();
            Console.Read();

        }
    }
}
执行结果:





作者:lypf19900912 发表于2013-3-30 14:21:51 原文链接
阅读:0 评论:0 查看评论

    
[2]RBAC基于角色的权限控制个人理解
    来源: 互联网  发布时间: 2013-10-30

基本上搞过it的都知道权限控制其实是很麻烦的一件事情,但是不难理解。在我学习rbac之前,对权限的理解基本上就是权限分配给角色,角色又分配给用户组,然后用户可以属于用户组之类的。一些企业级应用可能会有更复杂的情况,比如A部门的员工甲,就分配A角色给甲;若甲在B部门兼职,那就不是简单的把B角色分配给甲,兼职还是有区别的;rbac也只是一种模式而已,看下面的标准介绍:

NIST(The National Institute of Standards and Technology,美国国家标准与技术研究院,2004)标准RBAC模型由4个部件模型组成,这4个部件模型分别是:

·基本模型RBAC0(Core RBAC);

·角色分级模型RBAC1(Hierarchical RBAC,含General,Limited);

·角色限制模型RBAC2(Constraining RBAC,含Static/Dynamic Separation of Duty,即SSD和DSD);

·统一模型RBAC3(Combines RBAC)。


先从rbac0开始,上图:


此图从右往左分析

1、先看ob对象,也就是我们需要操作的对象,可以是用户本身,可以是角色本身,也可以是任何需要做权限控制的实体或虚拟的数据;

2、然后是op操作,操作不是权限,操作 + 对象 = 权限,应该这样理解

拿windows的文件来举例,那么ob就是文件,op就是 读、写、执行等,而权限 可以理解成 ob 和 op的笛卡尔乘积;例如  对文件的读权限、对文件的写权限等

3、prms权限,就是图中的大红圈,这个就不用解释了;role角色、user用户   这2个也很好理解

4、session这个比较难理解,现在我们假设没有session这个环节,其实权限控制也基本成型;

从分配上理解,prms可以分配给多个role,role可以有多个prms,role可以分配给多个user,user可以有多个role;

这样涉及到一个问题,当用户登录系统后,它具有的权限怎么计算呢?当然是先找这个用户有多少个角色,然后通过角色找总共有多少个权限,这样得到的一个权限的集合,这个集合就代表这个用户登录系统后的权限;

但是有的系统不是这么考虑的,rbac也不是这么考虑的;例如oracle,使用过的人应该知道,我们用sqlplus登录oracle时,需要选择此次登录,是用sysdba还是normal,这其实是对角色的一种选择;如果你选择以normal方式登录,那sysdba部分的权限就没有;那是不是sysdba部分的权限没有分配给用户呢?其实也不是

所以可以这样理解,所有分配给用户的权限是一个大的集合,而且是处于未激活状态,每次用户登录系统的时候,有选择的激活一部分的权限,作为此次登录系统的权限集合;

那如何做到这点,看rbac0的图,就是session;session是关联用户与角色的,每次用户登录,就会激活一个session,这个session对应的角色下的权限,就是此次用户登录系统的权限集合;

我个人理解,对于一些小的系统,比如一个简单的新闻发布网站,想用rbac来做权限控制,或者是自己想写一个简单的rbac小框架,可以考虑去除session的rbac0模式;

然后要注意ob对象这个数据库存储的设计,例如ob代表系统中注册的用户,有2000人,从理论上讲,用户的操作有  读、修改、删除、新增,如果要分配的话,那所有用户都对自己的个人信息有 读、修改 权限,那就有 2000对象 x 读、修改操作 = 4000个权限,然后分配给2000个角色,这2000个角色又单独分配给对应的2000个用户,这样就变的非常的麻烦;

而且,管理员有所有用户的 读、修改 操作权限,那每新增一个用户,都要把这个用户 维护到 ob中,再产生prms,再分配给管理员,这样也非常的麻烦;

如果哪个系统需要这么完整细微的权限控制,那麻烦是必须的,如果简单的系统,例如用户只有 普通用户 和 管理员 2种,那完全没有必要弄的那么复杂;

我个人理解,rbac模式只是给出一个思路,具体实现是可以灵活多变的;

比如ob,我可以把“所有用户”作为一个ob,然后 对此ob的操作权限分配给管理员,这样就不怕动态新增用户的时候,需要维护权限表;

再如,我加上潜规则,在用户查看自己的信息、或修改自己的信息时,可以不经过rbac的权限校验,直接查看;当然,你要理解,这个潜规则,就不是rbac层面的东西了,应该是业务层面的东西;

再举个例子,用户新增单据的权限,限制用户只能最多新增10张单据,那这种权限在rbac中如何配置如何体现?

好吧,我只能告诉你,没有办法。rbac做的仅仅是  有 或者 没有  这个权限;至于 什么情况下有,是次数限制  还是  时间段限制,这些都不是rbac关心的,这些是业务层逻辑关心的。


好吧,说多了,来看看rbac1,上图:


rbac0 和 rbac1之前的差别在rh角色继承,这个继承和oop中类的继承很相似;不多解释,看看官方点的说明

角色间的继承关系可分为一般(General)继承关系和受限(Limited

    
[3]SVN 中trunk、tags、branches使用
    来源: 互联网  发布时间: 2013-10-30

 

  • 简介
  • 我们都知道SVN是管理项目源代码的软件,可以把我们开发中的各个阶段的代码记录下来,供我们以后来使用,那么SVN具体的结构你是否知道呢?下面我们来介绍一下它的基本结构
  • Trunk、Branches、Tags、作用
  • Trunk
  • 这是SVN目录的主分支,表示日常开发中的项目,任何时候Trunk里包含的都是最新的开发代码。 这里的代码将会工作到你的下一个主要发布版本。
  • Trunk应该只被用来开发将会成为你的下一个重要版本的代码。
  • 几乎常常人们只使用trunk来存放他们的代码。发放了一个版本后继续在其上进行下一版开发。这样开发是混论的,如果出现大的Bug往往不好恢复到之前版本,因此,增加了一个Branches文件
  • Branches
  • 常用的Branches分支有好几种类型,这里列出常用的几种。
  •  Release Branches
  • 当trunk达到准备发布的阶段时(或者你想冻结新特色的添加时),你应该创建一个release branches。
  •  Bug fix branches
  • 分支也可以用于处理trunk或release branches里发现的严重的Bug。
  • Experimental branches
  • 有时你想将某个新技术引进项目。这很好,但是你当然不想赌上你的整个项目。想象一下,你想把你的Web程序从PHP4改为PHP5。你要花多少时间?在这期间你的trunk停止使用?直到你把所有到PHP5的转换做完
  • Tags
  • 一般情况下,tag,是用来做一个milestone的,不管是不是release,都是一个可用的版本。这里,应该是只读的。
  • 在SVN中Tag和Branches,在一个选项里面创建时区别不明显,Tags中存放的也是Trunk的一个副本,只不过是只读的,不可以修改,权限不同。
  • Trunk、Branches、Tags详细使用
  • Trunk
  • 文件夹中右键,选“Create repository here”
  •  
  • 选择“Create folder Structure”,然后,浏览建好的文件结构
  •  
  • Branches
  • Create
  • Merge
  • Branches To Trunk
  • 这种方式用的最多,属于常用的一种。
  • 在Trunk中,选中UI文件夹,右键
  •  
  • 如下图,选择”merge”
  •  
  • 选择“Merge a range of revisions”
  •  
  • 选择要合并的目录,这里选择branches中UI文件夹
  •  
  • 合并完成
  •  
  • Trunk To Branches
  • Branches To Branches
  • Tags
  • 标记同branches类似,同上.
  • 意义
  • SVN解决了我们数据备份、 版本控制、 数据同步等面对的问题,因而深受很多人喜爱和使用,它是一个不错的管理知识的软件工具。
  • 我们自己也可以用SVN管理我们的知识。
  •  

    作者:lilongsheng1125 发表于2013-3-31 10:39:04 原文链接
    阅读:30 评论:0 查看评论

        
    最新技术文章:
    ▪主-主数据库系统架构    ▪java.lang.UnsupportedClassVersionError: Bad version number i...    ▪eclipse项目出现红色叉叉解决方案
    ▪Play!framework 项目部署到Tomcat    ▪dedecms如何做中英文网站?    ▪Spring Batch Framework– introduction chapter(上)
    ▪第三章 AOP 基于@AspectJ的AOP    ▪基于插件的服务集成方式    ▪Online Coding开发模式 (通过在线配置实现一个表...
    ▪观察者模式(Observer)    ▪工厂模式 - 程序实现(java)    ▪几种web并行化编程实现
    ▪机器学习理论与实战(二)决策树    ▪Hibernate(四)——全面解析一对多关联映射    ▪我所理解的设计模式(C++实现)——解释器模...
    ▪利用规则引擎打造轻量级的面向服务编程模式...    ▪google blink的设计计划: Out-of-Progress iframes    ▪FS SIP呼叫的消息线程和状态机线程
    ▪XML FREESWITCH APPLICATION 实现    ▪Drupal 实战    ▪Blink: Chromium的新渲染引擎
    ▪(十四)桥接模式详解(都市异能版)    ▪你不知道的Eclipse用法:使用Allocation tracker跟...    ▪Linux内核-进程
    ▪你不知道的Eclipse用法:使用Metrics 测量复杂度    ▪IT行业为什么没有进度    ▪Exchange Server 2010/2013三种不同的故障转移
    ▪第二章 IoC Spring自动扫描和管理Bean    ▪CMMI简介    ▪目标检测(Object Detection)原理与实现(六)
    ▪值班总结(1)——探讨sql语句的执行机制    ▪第二章 IoC Annotation注入    ▪CentOS 6.4下安装Vagrant
    ▪Java NIO框架Netty1简单发送接受    ▪漫画研发之八:会吃的孩子有奶吃    ▪比较ASP和ASP.NET
    ▪SPRING中的CONTEXTLOADERLISTENER    ▪在Nginx下对网站进行密码保护    ▪Hibernate从入门到精通(五)一对一单向关联映...
    ▪.NET领域驱动设计—初尝(三:穿过迷雾走向光...    ▪linux下的块设备驱动(一)    ▪Modem项目工作总结
    ▪工作流--JBPM简介及开发环境搭建    ▪工作流--JBPM核心服务及表结构    ▪Eclipse:使用JDepend 进行依赖项检查
    ▪windows下用putty上传文件到远程Linux方法    ▪iBatis和Hibernate的5点区别    ▪基于学习的Indexing算法
    ▪设计模式11---设计模式之中介者模式(Mediator...    ▪带你走进EJB--JMS编程模型    ▪从抽象谈起(二):观察者模式与回调
    ▪设计模式09---设计模式之生成器模式(Builder)也...    ▪svn_resin_持续优化中    ▪Bitmap recycle方法与制作Bitmap的内存缓存
    ▪Hibernate从入门到精通(四)基本映射    ▪设计模式10---设计模式之原型模式(Prototype)    ▪Dreamer 3.0 支持json、xml、文件上传
    ▪Eclipse:使用PMD预先检测错误    ▪Jspx.net Framework 5.1 发布    ▪从抽象谈起(一):工厂模式与策略模式
    ▪Eclipse:使用CheckStyle实施编码标准    ▪【论文阅读】《Chain Replication for Supporting High T...    ▪Struts2 Path_路径问题
    ▪spring 配置文件详解    ▪Struts2第一个工程helloStruts极其基本配置    ▪Python学习入门基础教程(learning Python)--2 Python简...
    ▪maven springmvc环境配置    ▪基于SCRUM的金融软件开发项目    ▪software quality assurance 常见问题收录
    ▪Redis集群明细文档    ▪Dreamer 框架 比Struts2 更加灵活    ▪Maven POM入门
    ▪git 分支篇-----不断更新中    ▪Oracle非主键自增长    ▪php设计模式——UML类图
    ▪Matlab,Visio等生成的图片的字体嵌入问题解决...    ▪用Darwin和live555实现的直播框架    ▪学习ORM框架—hibernate(二):由hibernate接口谈...
    ▪(十)装饰器模式详解(与IO不解的情缘)    ▪无锁编程:最简单例子    ▪【虚拟化实战】网络设计之四Teaming
    ▪OSGi:生命周期层    ▪Javascript/Jquery——简单定时器    ▪java代码 发送GET、POST请求
    ▪Entity Framework底层操作封装(3)    ▪HttpClient 发送GET、POST请求    ▪使用spring框架,应用启动时,加载数据
    ▪Linux下Apache网站目录读写权限的设置    ▪单键模式的C++描述    ▪学习ORM框架—hibernate(一):初识hibernate
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3