接口

大厂常问iOS面试题--组件化篇

不想你离开。 提交于 2020-03-09 16:36:44
1.组件化有什么好处? 业务分层、解耦,使代码变得可维护; 有效的拆分、组织日益庞大的工程代码,使工程目录变得可维护; 便于各业务功能拆分、抽离,实现真正的功能复用; 业务隔离,跨团队开发代码控制和版本风险控制的实现; 模块化对代码的封装性、合理性都有一定的要求,提升开发同学的设计能力; 在维护好各级组件的情况下,随意组合满足不同客户需求;(只需要将之前的多个业务组件模块在新的主App中进行组装即可快速迭代出下一个全新App) 2.你是如何组件化解耦的? 分层 基础功能组件:按功能分库,不涉及产品业务需求,跟库Library类似,通过良好的接口拱上层业务组件调用;不写入产品定制逻辑,通过扩展接口完成定制; 基础UI组件:各个业务模块依赖使用,但需要保持好定制扩展的设计 业务组件:业务功能间相对独立,相互间没有Model共享的依赖;业务之间的页面调用只能通过UIBus进行跳转;业务之间的逻辑Action调用只能通过服务提供; 中间件:target-action,url-block,protocol-class 3.为什么CTMediator方案优于基于Router的方案? Router的缺点: 在组件化的实施过程中,注册URL并不是充分必要条件。组件是不需要向组件管理器注册URL的,注册了URL之后,会造成不必要的内存常驻。注册URL的目的其实是一个服务发现的过程,在iOS领域中

接口默认方法是什么鬼

荒凉一梦 提交于 2020-03-09 16:03:54
接口之所以成为接口,就在于它没有实现,只是声明。但后来一切都变了,Java 里出现了默认方法,C# 也出现了默认方法。接口已经不像传统意义上的接口,其概念开始向抽象类靠近,一个纯抽象的东西,突然出现了实体,于是开始傻傻分不清了。 世界已经变了,可他是怎么开始改变的呢? 1. 缘起 虽然本文有提到 Java,但是笔者近年主要还是在写 C# 程序,所以未明确语言的命名规范会更倾向 C# 的规范一些,敬请谅解。 曾经,我们定义了 IStringList 接口,它声明了一个列表: 这只是个例子,为了避免引入更多的技术概念,这里没有使用泛型举例。 interface IStringList { void Add(string o); // 添加元素 void Remove(int i); // 删除元素 string Get(int i); // 获取元素 int Length { get; } // 获取列表长度 } 不管怎么说,这个列表已经拥有了基本的增删除改查功能,比如遍历,可以这样写 IStringList list = createList(); for (var i = 0; i < list.Length; i++) { string o = list.Get(i); // Do something with o } 这个 IStringList

读Java程序员面试笔记,总结Java基础知识(二)

爷,独闯天下 提交于 2020-03-09 14:55:38
Java基础知识之面向对象技术 面向对象有哪些特征 面向对象主要特征:抽象、继承、封装和多态。 抽象。抽象是忽略一个主题中与当前目标无关的那些方面,一边更充分地注意与当前目标有关的方面,抽象包括两个方面:一是过程抽象;二是数据抽象。 继承。在编程中,对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。子类可以从他的父类那里继承方法和实例变量,并且子类可以修改或增加新的方法使之跟适合我们的需要。 封装。封装是指将客观事物抽象成类,每个类对自身的数据和方法实行保护。类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。(也就是类的权限修饰的权限,权限范围内就是可信,反之。) 多态。多态是指允许不同类的对象对同一消息做出响应。多态包括参数多态和包含多态。多态性语言具有灵活、抽象、行为共享、代码共享等优势,很好的解决了应用程序函数同名的问题。 面向对象的开发方式有什么优点 较高的开发效率 。(面向对象的开发方式,对象都是从我们现实事物抽象而来,映射为开发的对象,那么我们对开发的对象的各种特征,以及对象的功能都是直观明了的。) 保证软件的鲁棒性。(面向对象的开发中,重点是对象,还有对象延展出来的类,方法都在开发中经常使用,自然而然对软件的鲁棒性起到了很好的促进作用)

ABP开发框架前后端开发系列---(10)Web API调用类的简化处理

痞子三分冷 提交于 2020-03-09 14:03:17
有一小段时间没有持续升级ABP框架了,最近就因应客户的需要,把ABP框架进行全面的更新,由于我们应用的ABP框架,基础部分还是会使用官方的内容,因此升级的时候需要把官方基础ABP的DLL进行全面的更新,以及对应的引用DLL也同步更新才行。不过在升级过程中还是很多奇奇怪怪的问题,本篇随笔针对出现的情况进行一系列的总结,以便后面有一个对照参考吧。 1、最新案例源码和NugGet程序包更新 ABP官方的基础模块更新速度还是很快的,一段时间过去,就跳过了几个版本号,我是在旧版本的基础上进行手动的NugGet更新,但是基于VS的Nugget总是更新卡顿,不知不觉就没有反应了,严重影响开发的效率。因此先从官方下载的Demo案例中把相关部分源码进行更新。 官方的案例源码下载地址是: https://aspnetboilerplate.com/Templates 1)最新案例源码结构和部分内容调整 我们从其中下载对应的源码,然后根据项目结构中的对应源码文件,使用Beyond Compare对比文件进行文件逐一对比,原则上除了个人扩展的部分,都以官方的源码做法为准即可。 目前ABP官方最新的DLL版本是5.3.0,可以下载的Demo版本是5.2.0,它们应该差别不大。下载下来的Aspnet-core部分的源码结构如下所示。 而我们的ABP框架是在这个基础上进行一定的结构优化,以更加方便快速的开发

微信机器人接口

时光毁灭记忆、已成空白 提交于 2020-03-09 11:58:55
微控API 是一套的微信个人号 接口,它能监测微信中的各种事件,并辅助微信执行各种操作,提供了客户与微信个人号对接的能力,技术上来讲是一款基于MAC/IPAD协议开放性API。杜绝封号,追封,批量封等封号问题,支持多种微信方式接入。 你可以 通过API 实现 个性化微信功能 (例:营销系统、机器人小助手、客服系统等),用来自动管理微信消息 文档地址: 点击这里 https://wkteam.gitbook.io/api 在线测试: 点击这里 (https://documenter.getpostman.com/view/1268847/SzKQxKf5?version=latest#355af8ee-0353-4a9e-92f6-ff284c514bec) 来源: https://www.cnblogs.com/wkteam/p/12447086.html

spring 之7种重要设计模式

ぃ、小莉子 提交于 2020-03-09 08:52:44
Spring中涉及的设计模式总结 1.简单工厂(非23种设计模式中的一种) 实现方式: BeanFactory。Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。 实质: 由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 实现原理: bean容器的启动阶段: 读取bean的xml配置文件,将bean元素分别转换成一个BeanDefinition对象。 然后通过BeanDefinitionRegistry将这些bean注册到beanFactory中,保存在它的一个ConcurrentHashMap中。 将BeanDefinition注册到了beanFactory之后,在这里Spring为我们提供了一个扩展的切口,允许我们通过实现接口BeanFactoryPostProcessor 在此处来插入我们定义的代码。典型的例子就是:PropertyPlaceholderConfigurer,我们一般在配置数据库的dataSource时使用到的占位符的值,就是它注入进去的。 容器中bean的实例化阶段: 实例化阶段主要是通过反射或者CGLIB对bean进行实例化,在这个阶段Spring又给我们暴露了很多的扩展点: 各种的Aware接口 ,比如

工厂模式

ぐ巨炮叔叔 提交于 2020-03-09 02:43:35
一、工厂模式的由来 二、简单工厂模式 例子:创建一个ICourse课程接口: 创建一个JavaCourse实现类: 创建一个PythonCourse实现类: 创建一个CourseFactory类,用来生成JavaCourse或PythonCourse对象: 创建一个SimpleFactoryTest测试类,来看客户端调用: 类关系结构图: 1、简单工厂模式(Simple Factory Pattern):指由一个工厂对象决定创建出哪一种产品类的实例。(属于创建型模式,但它不属于GOF(四位作者)的23种设计模式之一) 2、目的:减少代码冗余程度,提高代码的复用性。 3、适用场景 工厂类负责创建的对象较少 客户端只需要传入工厂类的参数,对于如何创建对象的逻辑不需要关心 4、优点:只需传入一个正确的参数,就可以获取你所需要的对象,无需知道其创建的细节。 5、缺点 工厂类的职责相对过重,增加新的产品时,如果产品存在差异化的逻辑,则需要修改工厂类的判断逻辑,违背开闭原则 不易于扩展过于复杂的产品结构 三、工厂方法模式 (简单工厂模式的升级版) 例子:创建一个ICourseFactory接口,也可以是抽象类(超级工厂): 创建一个JavaCourseFactory工厂实现类,用来生成JavaCourse对象: 创建一个JavaCourseFactory工厂实现类

设计模式之适配器模式

前提是你 提交于 2020-03-09 00:10:44
适配器模式 概述 适配器模式是一种使用频率非常高的结构型设计模式,如果再系统中存在不兼容的接口,可以通过引入一个适配器来使原本因为接口不兼容而不能一起工作的两个类能够协调工作 将一个类的接口转换成客户希望的另一个接口,适配器模式让那些接口不兼容的类可以一起工作 适配器模式 Target(目标抽象类) 目标抽象类定义客户所需的接口,可以是一个抽象类或者接口,也可以是具体类,再适配器中,由于java语言不支持多重继承它只能是接口 Adapter(适配器类) 它可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器Adapter是适配器模式的核心,在类适配器中,它通过实现Target接口并继承Adaptee类来使二者产生联系,在对象适配器中,它通过继承target并关联一个Adaptee对象使二者关联 Adaptee(适配者类) 适配者即适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下甚至没有适配者类的源代码 /** * @ClassName: CarControoler * @Description: 汽车控制类,充当目标抽象类 * @Author Crazy * @DateTime 2019年11月2日 下午8:28:28 */ public abstract class

Java课程预习5

纵然是瞬间 提交于 2020-03-08 23:04:41
方法的重写规则 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。 声明为 final 的方法不能被重写。 声明为 static 的方法不能被重写,但是能够被再次声明。 被重载的方法必须改变参数列表(参数个数或类型不一样),被重载的方法可以改变访问修饰符 多态存在的三个必要条件 继承 重写 父类引用指向子类对象 实例: public class Test { public static void main ( String [ ] args ) { show ( new Cat ( ) ) ; // 以 Cat 对象调用 show 方法 show ( new Dog ( ) ) ; // 以 Dog 对象调用 show 方法 Animal a = new Cat ( ) ; // 向上转型 a . eat ( ) ; // 调用的是 Cat 的 eat Cat c = ( Cat ) a ; // 向下转型 c . work ( ) ; // 调用的是 Cat 的 work } public static void show ( Animal a ) { a . eat ( ) ; // 类型判断 if ( a

Java基础 -- 13 Map集合

烈酒焚心 提交于 2020-03-08 21:05:52
** Map集合** 定义: 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map<K,V>接口。 java.util.Map<K,V>接口是最高接口,注意和Collection没有直接联系。 第一个泛型代表键是什么类型。 第二个泛型代表值是什么类型。 二者可以同类型,也可以不同类型。 通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。 Collection中的集合,元素是孤立存在的,Map中的集合,元素是成对存在的,每个元素由键与值两部分组成。因此Collection中的集合称为单列集合 ,Map中的集合称为双列集合,这两个接口没有任何关系 Map集合使用时是通过键去获取值,每个键只能对应一个值。需要注意的是,Map集合不能包含重复的键,但值可以重复。 Map常用子类 认识Map中常用的子类知道其各自特点 HashMap<K,V>: 快,键唯一,自定义键重写hashCode和equals 不能保证才存取顺序 LinkedHashMap<K,V>: 继承了HashMap的特点,但是有存取顺序 HashMap<K,V>:存储数据采用的哈希表结构