精华内容
下载资源
问答
  • 为云中的应用程序定义服务抽象。 目的 当运行几个小服务而不是几个非常大的服务时,标准化某些元素很有用。 好处包括:提高开发人员的理解(源于熟悉),以及通用工具的出现——用于诸如监控和警报之类的事情——...
  • 围绕Google Optimize高度可定制,无依赖,通用的服务抽象。 google-optimize-service在周围提供了一个轻量级的抽象层。 它使您可以轻松访问和管理实验信息。 目录 得到() 钥匙() 地点() 坚持() ...
  • Symfony服务合同 从Symfony组件中提取的一组抽象。 可用于构建Symfony组件被证明有用的语义,并且已经有经过实战测试的实现。 有关更多信息,请参见 。
  • SOA 的服务抽象

    千次阅读 2009-02-13 23:17:00
    1,SOA 的三个抽象级别从概念上讲,SOA 中有三个主要的抽象级别:操作:代表单个逻辑工作单元(LUW)的事务。执行操作通常会导致读、写或修改一个或多个持久性数据。SOA 操作可以直接与面向对象 (OO) 的方法相比。...

    1,SOA 的三个抽象级别
    从概念上讲,SOA 中有三个主要的抽象级别:
    操作:代表单个逻辑工作单元(LUW)的事务。执行操作通常会导致读、写或修改
    一个或多个持久性数据。SOA 操作可以直接与面向对象 (OO) 的方法相比。它们
    都有特定的结构化接口,并且返回结构化的响应。同方法一样,特定操作的执行可
    能涉及调用附加的操作。
    服务:代表操作的逻辑分组。服务可以分层,以降低耦合度和复杂性。一个服务的
    粒度(granularity)大小也与系统的性能息息相关。粒度太小,会增加服务间互操作
    通信的开销;粒度太大,又会影响服务面对需求变化的敏捷性。
    业务流程:为实现特定业务目标而执行的一组长期运行的动作或活动。业务流程通
    常包括多个业务调用。
    在 SOA 中,业务流程包括依据一组业务规则按照有序序列执行的一系列操作。操作的
    排序、选择和执行称为服务或流程编排。典型的情况是调用已编排服务来响应业务事件。从
    建模的观点来看,由此带来的挑战是如何描述设计良好的操作、服务和流程抽象的特征,以
    及如何系统地构造它们。这些涉及服务建模、特征抽取的问题已经成为现阶段人们关注的焦
    点。
    2,服务抽象
    一个可复用的服务包括服务的描述、服务的实现以及服务的映射等。
    服务的实现(service implementation):任何提供 Web 服务支持的执行环境都可以认为
    是服务的实现,服务的实现也称之为可执行代理(executable agent),它负责实现服务处理模
    型,在执行环境中运行,这里的可执行环境通常是某种编程语言。
    服务的描述(service description):它通常与可执行代理是分开的,一个服务描述可以
    由多个不同的代理与之相关联,而一个可执行代理也可以支持多个服务描述。
    映射层(maping layer):有时也称之为转换层,实现与执行环境的分离,映射层通常以
    代理(proxy)或者桩(stub)的形式出现,映射层负责接收消息、转换 XML 到本地格式、
    把数据派送到可执行代理。
    我们已经讨论过,Web 服务区分请求者和提供这两种角色:
    服务请求者:通过向服务器发送一条消息来启动服务的执行。
    服务提供者:收到消息以后执行服务,然后把结果返回给服务请求者。
    服务抽象的好处在于,易于访问不同类型的服务,比如新开发的服务、经过包装的传统
    应用,或者由其它服务合成的应用等。
    有时候服务提供者也可能是服务请求者,也就是说,服务请求者与服务提供者可以被组
    织成一种 N 层结构。

    展开全文
  • 具有以下规范的抽象服务实现: 服务选项:构造函数第一个参数是不可变的纯对象 服务公共方法:始终异步,因此可以在本地(当以npm软件包安装时)或在远程(例如,使用seneca)调用,而无需使用者重构,仅接受一个...
  • Web服务抽象模型检查
  • 抽象类、抽象函数/抽象方法详解

    千次阅读 2018-06-13 23:55:23
    抽象类、抽象函数/抽象方法详解 C#抽象类运用 本文提供全流程,中文翻译。 China助力快速理解 抽象类、抽象函数 为新手节省宝贵的时间,避免采坑! 抽象类 —— 修饰词 : abstract 抽象父类中的 抽象函数 是不完整...

    抽象类运用


    本文提供全流程,中文翻译。

    Chinar 坚持将简单的生活方式,带给世人!

    (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)



    Chinar —— 心分享、心创新!

    助力快速理解 抽象类、抽象函数

    为新手节省宝贵的时间,避免采坑!



    全文高清图片,点击即可放大观看 (很多人竟然不知道)


    1

    Abstract Class —— 抽象类


    抽象类 —— 修饰词 : abstract

    抽象父类中的 抽象函数 是不完整的,只有方法名和参数,并没有方法体

    任何继承于抽象类的子类,都需要重 写父类(抽象类) 中的所有 抽象函数/抽象方法
    举个栗子黑白88
    下面我们举个栗子,来说明抽象类的具体用法


    2

    Abstract Parent Class —— 抽象父类


    在VS控制台程序中,创建一个抽象类

    为了便于理解, Chinar 已经用上了弱爆的拼音命名法,请高手给予理解与宽容
    举个栗子黑白88

    //无需任何引用,即可创建抽象类
    
    namespace 抽象类
    {
        /// <summary>
        /// 抽象类 —— 修饰词:abstract
        /// </summary>
        public abstract class ChouXiang//弱爆的拼音命名法,便于新手理解
        {
            /// <summary>
            /// 类中可以有 虚方法等
            /// </summary>
            public virtual void Eat() //虚方法可以重写,也可以不重写,直接继承
            {
                 Console.WriteLine("抽象父类中:吃方法");//是有方法体的
            }
    
    
            /// <summary>
            /// 指纹 —— 就是一个抽象函数。因为此函数,子类只要用到,必须要重写的。
            /// 所以就有了抽象类,这种不完整的模板 —— 没有方法体
            /// </summary>
            public abstract void FingerPrint();
            public abstract void FingerPrint1();
            public abstract void FingerPrint2();
            public abstract void FingerPrint3();
            public abstract void FingerPrint4();
            public abstract void FingerPrint5();
        }
    }

    3

    Abstract Parent Class —— 抽象父类


    在VS控制台程序中,创建一个抽象类

    为了便于理解, Chinar 已经用上了弱爆的拼音命名法,请高手给予理解与宽容
    举个栗子黑白88

    using System;
    
    namespace 抽象类
    {
        /// <summary>
        /// 人类:继承与抽象类
        /// 当一个类,继承抽象类的时候,必须实现抽象函数
        /// </summary>
        class People : ChouXiang
        {
            /// <summary>
            /// 可直接通过 VS implement missing members :实现丢失的成员,一键实现所有抽象函数的重写
            /// 必须去重写父类中的抽象函数,具体函数体,根据需求实现
            /// </summary>
            public override void FingerPrint()
            {
                Console.WriteLine("人类的指纹");
            }
    
    
            public override void FingerPrint1()
            {
                throw new NotImplementedException();
            }
    
    
            public override void FingerPrint2()
            {
                throw new NotImplementedException();
            }
    
    
            public override void FingerPrint3()
            {
                throw new NotImplementedException();
            }
    
    
            public override void FingerPrint4()
            {
                throw new NotImplementedException();
            }
    
    
            public override void FingerPrint5()
            {
                throw new NotImplementedException();
            }
        }
    }

    4

    Abstract Parent Class —— 抽象父类


    在VS控制台程序中,创建一个抽象类

    为了便于理解, Chinar 已经用上了弱爆的拼音命名法,请高手给予理解与宽容
    举个栗子黑白88

    using System;
    
    
    namespace 抽象类
    {
        /// <summary>
        /// 测试项目类:继承自人类People
        /// 由于PeoPle已经将抽象类ChouXiang中 抽象函数重写,所以下边可以直接调用PeoPle中的方法
        /// </summary>
        class Program : People 
        {
            static void Main(string[] args)
            {
                People p = new People();
                p.FingerPrint();
    
                ChouXiang c = new People(); //可以通过抽象类去声明对象,但不可以去构造.只能用其派生类构造
                c.Eat();                    //用派生类构造后,可调用ChouXiang类中函数
                c.FingerPrint();            //由于对 FingerPrint 是重写了,所以父类中的方法是不存在的。
    
                Program program = new Program();
                program.FingerPrint();
    
                Console.ReadLine();
            }
        }
    }

    控制台输出:

    人类的指纹
    抽象父类中:吃方法
    人类的指纹
    人类的指纹

    支持

    May Be —— 搞开发,总有一天要做的事!


    拥有自己的服务器,无需再找攻略!

    Chinar 提供一站式教程,闭眼式创建!

    为新手节省宝贵时间,避免采坑!


    先点击领取 —— 阿里全产品优惠券 (享受最低优惠)


    1 —— 云服务器超全购买流程 (新手必备!)

    2 —— 阿里ECS云服务器自定义配置 - 购买教程(新手必备!)

    3—— Windows 服务器配置、运行、建站一条龙 !

    4 —— Linux 服务器配置、运行、建站一条龙 !




    <script type="math/tex" id="MathJax-Element-3"> </script>
    技术交流群:806091680 ! Chinar 欢迎你的加入


    END

    本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

    对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

    对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

    展开全文
  • 基于模型检查MAS和抽象的Web服务验证
  • 分布式服务 分布式框架的抽象服务 安装 npm i distributed-service 构建状态
  • GB61850-7-2_抽象通讯服务接口
  • BeanServices将充当抽象层,用于将所有类型的服务实现与应用程序的其余部分分离。 服务客户端将不依赖于服务实现; 它们将仅依赖于抽象。 此外,服务客户端与BeanServices的依赖关系应尽可能少。
  • 在SONATA服务平台中,基础结构抽象扮演MANO框架与基础(虚拟化)基础结构之间的抽象层的角色。 基础结构抽象允许编排器的实体与基础结构进行交互,而不管用于管理基础结构的特定技术如何。 它公开了用于管理服务和...
  • 带着问题学 Kubernetes 抽象对象 Service https://github.com/jasonGeng88/blog/blob/master/201707/k8s-service.md 摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog 文章...

    带着问题学 Kubernetes 抽象对象 Service

    https://github.com/jasonGeng88/blog/blob/master/201707/k8s-service.md

    摘要:本文属于原创,欢迎转载,转载请保留出处:https://github.com/jasonGeng88/blog

    当前环境

    1. Mac OS 10.11.x
    2. kubectl == v1.6.4
    3. minikube == v0.19.1
    4. docker == 1.11.1

    知识点

    • Service 的 Selector 与 Label 匹配机制
    • Service 与 Pods 的地址映射关系
    • kube-proxy 的 iptables 代理机制
    • Service 的服务发现机制
    • Service 的服务暴露方式

    前言

    上一篇讲述了 Pod 的相关内容,了解了 Pod 的定义、生命周期以及通信机制等。正如上文说的,Pod 是存在生命周期的,它的崩溃、更新都是以创建新 Pod 替换原有的 Pod 的方式进行的,所以通过固定 Pod 地址的访问变得不太可行。我们需要通过一种上层调用的方式,来解决底层 Pod 的动态变化的场景。

    庆幸,K8S 引入了 Service 这个抽象的概念。Service 会创建一个虚拟的服务,由它来整合集群内的 Pod。Service 会虚拟出一个 VIP,并在它销毁之前保持该 VIP 地址保持不变。通过对它的访问,以代理的方式负载到对应的 Pod 上,同时 Pod 生命周期的变换,也会及时反应在代理上。

    下面我们几种常见的场景,来具体看看 Service 是如何工作的。

    环境准备

    演示镜像

    • 镜像名:jasonn/php-echoserver
    • 作用:打印当前容器的 IP

    K8S Pod 创建

    • 文件名:deploy-echoserver.yml (这里以 Deployment 的方式来创建与管理 Pod
    • 文件内容:
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      # Deployment 实例名称
      name: echoserver
    spec:
      # 设置 Pod 个数
      replicas: 2
      template:
        metadata:
          # 设置 Pod 标签
          labels:
            app: echoserver
        spec:
          # 运行 docker 镜像
          containers:
          - name: echoserver 
            image: jasonn/php-echoserver
    • 启动命令:
    kubectl create -f deploy-echoserver.yml
    

    至此,准备工作全部完成。短暂的等待后,Pod 创建成功,并且也由 deployment 管理着。

    查看 deployment 启动情况:

    对 Pod 的访问情况如下(通过kubectl describe pods获取 Pod 的 IP 地址):

    问题

    场景1:现在 K8S 上运行着2个 Pod。我们希望通过上述所说的 Service 来整合这两个 Pod 的访问,完成对它们的统一访问,而不用向具体的 Pod 发出请求。

    Q1: Service 如何对 Pod 进行整合

    这里所说的 Pod 默认都是带有标签(label)的,我们之前创建的两个 Pod 所赋予的标签是 app: echoserver,所以我们在创建 Service 时,就要通过选择器(selector)来获取符合条件的 Pod 进行整合。

    Service 创建脚本内容如下(service-echoserver.yml):

    apiVersion: v1
    kind: Service
    metadata:
      # Service 实例名称
      name: svc-echoserver
    spec:
      ports:
        - protocol: TCP
          # Service 端口地址
          port: 8080
          # Pod 端口地址
          targetPort: 80
      selector:
        # 匹配符合标签条件的 Pod
        app: echoserver

    创建 Service 命令:

    kubectl create -f service-echoserver.yml
    

    由此,我们创建好了一个 Service,同时也生成了一个对应的 VIP。

    查看 Serivce 创建情况:

    下面,我们来验证下是否如之前所说,对 VIP 的访问能访问到 Pod 的内容。

    我们发现不仅能成功访问,而且还提供了负载均衡的功能。后面会讲负载是怎么实现的

    PS: 标签筛选查找范围仅在同个命名空间(namespace)内。


    场景2:了解了 Service 是通过 label & selecor 来进行整合 Pod 的。那如果 Pod 不存在标签,又或者是在不同 Namespace 下,也可能是 K8S 集群外的一个服务。现实情况往往更加复杂,这样的情况下,Service 又该如何整合。

    Q2: Service 与 Pod 的地址映射关系由谁管理?

    这里引出了另一个概念 Endpoints。我们先来看看它的一个具体情况。

    发现在 Service 创建的同时,还生成了一个 Endpoints。 该 Endpoints 与 Service 同名,它所暴露的地址信息正是对应 Pod 的地址。由此猜测是 Endpoints 维护了 Service 与 Pod 的映射关系。

    为了验证我们的猜测,我们手动删除 Endpoints,发现之前能成功访问到 Pod 的 VIP,现在已经已经访问不到了。

    我们在手动把 Endpoints 创建回来,创建脚本如下(endpoint-echoserver.yml):

    apiVersion: v1
    kind: Endpoints
    metadata:
      # Endpoints 实例的名称
      name: svc-echoserver
    subsets:
      - addresses:
        - ip: 172.17.0.5
        - ip: 172.17.0.6
        ports:
        - port: 80

    创建命令:

    kubectl create -f endpoint-echoserver.yml
    

    注意:Endpoints 与 Service 的绑定关系通过名称来关联的,所以这两者的名称(name)一定要一致。

    如果创建失败,出现的错误信息是“...endpoints "svc-echoserver" already exists”,说明 Service 已经更新了 Endpoints。这里就说到了 Service 会定期去检查 Pod 的状态,并且将结果更新到 Endpoints 上。

    VIP 再次访问时又能成功访问到,如图:

    现在我们已经能轻松的解决场景2的问题了,在创建 Service 时,只要不设置 Selector 属性,那么将不会自动创建 Endpoints,这是我们可以根据需求手动的创建指定地址(address)的 Endpoints,来解决标签无法实现的整合。


    场景3:知道了 Service、Endpoints、Pod 的三者关系后,我们来具体看看所说的代理到底是如何实现的。从之前 K8S 的架构中,我们知道 Service 的代理是由 kube-proxy 实现的。而它的代理模式(Proxy mode)主要有两种:userspace 与 iptables。自 K8S v1.2 开始,默认的代理模式就是 iptables,并且它的性能也是要高于 userspace 的,所以在这儿只讨论 iptables 的实现。

    Q3:kube-proxy 是如何使用 iptables 做到服务代理的(对于 iptables 不了解的同学可以直接跳过)?

    我们现在要做的呢,是将 VIP 请求给转发到对应的 Pod 上。而实现此的正是 iptables。

    了解 iptables 的同学都知道四表五链的概念,而做端口地址转发的呢,主要是在 nat 表中实现。我们下面看一下一个 VIP 请求在 nat 表中是如何一步步被转发到 Pod 上的。

      1. 根据 iptables 的机制,请求是先到 nat 表的 PREROUTING 链(chain)上的,它的规则如下:

    从图中发现,请求首先经过 KUBE-SERVICE 链,其次再到 DOCKER 链上的。

      1. 我们看一下 KUBE-SERVICE 的情况:

    我们发现 KUBE-SERVICE 中包含了一系列 Service 的规则。根据我们请求的 VIP 的目的地址,对应到了下一个名叫 KUBE-SVC-PRQ3AXYQLQGIVVIU 的 Service 链上。

      1. KUBE-SVC-PRQ3AXYQLQGIVVIU 规则如下:

    从规则的名字上可以看出,该条 Service 链上记录的是2个 Endpoints 链,具体的选择是通过 50% 的随机性的进行决定(这也是它的一个负载规则)。

      1. 我们来看第一个名叫 KUBE-SEP-JSFY3ZFM2EVD64VQ 的 Endpoints 链的情况:

    从图中,我们已经很清晰的看到了它转发到 Pod 的具体规则。

      1. 下面以一张简单的流程图,看一下请求的转发情况:

    关于 DOCKER 链的跟踪,方法是差不多的,请求 从 nat 表结束后,在到 filter 表中,这里就不加以说明了。

    而这些规则的实现正是由 Service、Endpoints 来完成的。我们在创建、更新、以及其自身的检测机制,都会对这些规则进行更新。


    场景4:Service 的创建、内部结构以及映射关系,我们都了解了。下面我们就要关心如何优雅的使用它,上面我们都是通过 Service 的 VIP 进行访问的。这存在的问题是,如果有服务与服务之间的调用,难道我还要知道所调用服务的 VIP 不成,对于 VIP 的访问能否更通用一些。

    Q4:Service 的服务发现机制是怎样的?

    对于服务与服务间的调用,实际上就是 Pod 对 Servie 的调用。而 Pod 是如何发现 Service 的,这里可选择的方式有2种。

    我们通过启动一个名为 busybox 的 Pod 来观察这两种方式:

    kubectl run -i --tty busybox --image=busybox --restart=Never -- sh
    
    • 环境变量:

    在 Pod 中,集群中的 Service 会以环境变量的方式赋值在容器中,我们可以通过 {SERVICE_NAME}_SERVICE_HOST 和 {SERVICE_NAME}_SERVICE_PORT 进行获取(对于有多个 Port 的,可以通过带指定 PORT 名称的变量获得。)。

    busybox 中 环境变量如下:

    查看访问情况:

    • dns 解析:

    第二种方式是通过 kube-dns 对 Service 进行域名解析,同样能达到服务发现的目的。

    查看 DNS 域名解析配置: 

    通过 nslookup 查询 dns 记录: 

    查看访问结果: 


    场景5:集群间的服务调用解决了,可说到底还是通过的 VIP 进行的访问。VIP 对于集群外的终端用户,是无法访问的。所以我们得通过服务暴露的方式,让终端用户能与集群内的服务进行通信。

    Q5:Service 是如何对外暴露服务的?

    在 Service 的配置文件中,属性spec.type就是用来设置服务暴露的方式,它提供的三种方式如下:

    • ClusterIP: 提供一个集群内部的虚拟IP以供Pod访问(默认类型,我们上述使用的正是这种方式)。
    • NodePort: 在每个Node上打开一个端口以供外部访问。
    • LoadBalancer: 通过外部的负载均衡器来访问(一般需要云提供商提供 LB 支持)。

    我们这里简单起见,还是通过 NodePort 方式进行。

    修改 Service 配置文件,并重新启动:

    apiVersion: v1
    kind: Service
    metadata:
      # Service 实例名称
      name: svc-echoserver
    spec:
      ports:
        - protocol: TCP
          # Service 端口地址
          port: 8080
          # Pod 端口地址
          targetPort: 80
      selector:
        # 匹配符合标签条件的 Pod
        app: echoserver
      type: NodePort

    注意:这里如果要以kubecrl replace -f service-echoserver.yml方式进行平滑更新,配置中需添加spec.clusterIP属性,值为当前 Service 的 VIP,否则更新会失败。这也符合了一开始说的 Service 在它终止之前,VIP 是不会改变的。

    查看 Service 更新情况:

    外部访问(该 Node 地址是:192.168.64.6):

    总结

    文本从 Service 的标签与选择器开始,讲了 Service 整合 Pod 的过程,引出了 Service, Endpoints, Pods 三者的关系情况。随后又通过 iptables 详细展开了 kube-proxy 的代理机制。最后,以 Service 的集群内与集群外的访问设置,讲述了 Service 的服务发现与服务暴露机制。

    关于 Service 的有遗漏重要的知识点,或者有讲的不对的地方,也欢迎提出和指正!最后,希望本篇对你学习 K8S 有所帮助~

    展开全文
  • 面向服务开发方法的3种抽象级别

    千次阅读 2019-02-18 09:10:12
    操作 服务 业务流程

    操作

    位于最底层,代表单个逻辑单元的事物

    服务

    位于第二层,代表操作的逻辑分组,具有特定的结构化接口,并返回结构化响应

    业务流程

    位于最高层,为了实现特定业务目标而执行的一组长期运行的动作或活动

    展开全文
  • 顶级语言服务抽象,让您可以在项目的上下文中使用它。 安装 要使用此模块,请通过 npm 安装它: npm install tspms 目的 该模块在之上提供了一个简单的抽象,允许用户管理多个项目并在这些项目的上下文中访问...
  • 当程序员具备了抽象思维

    万次阅读 2021-03-22 14:32:46
    硕大而抽象,且非常美丽。 作者:张建飞 若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。——大卫·林奇 前言 抽象思维是我们工程师最重要的思维能力。因为软件技术 ...
  • 抽象工厂模式

    千次阅读 2018-04-08 09:56:53
    抽象工厂模式(Abstract Factory Pattern) 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一...
  • 面向对象之抽象

    千次阅读 2019-04-20 18:52:02
    抽象类Abstract 抽象类 形状类:三角形 圆形 矩形 父类的方法必须要存在,因为我们多态的必要条件是必须存在方法重写 方法的实现毫无意义 提供一个方法的声明即可,不需要实现,就是抽象方法 抽象类的特点: 1.抽象方法...
  • c#抽象函数

    千次阅读 2014-12-10 19:11:59
    今天使用到了C#的抽象函数,在继承的时候出了些问题,特此记录: 首先注意几个概念: 1、c#的抽象函数必须声明在抽象类中,即类前面要加:abstract关键字; 2、抽象函数不能有具体实现部分; 3、抽象函数在...
  • 在上两篇文章中,我们介绍了如何为Android系统的硬件编写驱动程序,包括如何在Linux内核空间实现内核驱动程序和在用户空间实现硬件抽象层接口。实现这两者的目的是为了向更上一层提供硬件访问接口,即为Android的...
  • Android硬件抽象层(HAL)

    千次下载 热门讨论 2013-10-23 10:02:46
    这个层次恰好对应了Android系统的架构层次,它向下涉及到Linux内核,向上涉及到应用程序框架层的服务,以及应用程序层对它的使用。Android硬件抽象层模块的开发本身也遵循一定的规范。有了这个规范之后,系统就可以...
  • java 抽象类的特点

    千次阅读 2019-04-21 19:59:38
    抽象类 在多态中,父类的方法必须存在,因为多态的必要条件必须存在方法重写 方法的实现毫无意义 提供方向的声明即可,不需要实现,就是抽象方法 抽象类的特点:   1 抽象方法和抽象类使用 abstract 修饰  ...
  • 因此只要类的public服务不改变,系统其余部分就不受影响。  许多程序设计语言强调动作。在这些语言中,数据的存在是用来支持程序采取的动作的,以c++为代表的面向对象的程序设计是创建类型和这些类型(也就是类...
  • 程序员必备的思维能力:抽象思维

    万次阅读 多人点赞 2021-02-12 18:03:28
    若想捉大鱼,就得潜入深渊。深渊里的鱼更有力,也更纯净。硕大而抽象,且非常美丽。——大卫·林奇抽象思维是我们工程师最重要的思维能力。因为软件技术 本质上就是一门抽象的艺术。我们的工作是存思维...
  • 关于抽象和具体

    千次阅读 2011-08-15 16:30:06
    关于抽象和具体 什么是抽象呢?首先不必澄清什么是抽象,而从什么算抽象说起,稳定的、高层的就代表了抽象。就像一个公司,最好保证了高层的稳定,才能保证全局的发展。在进行系统设计时,稳定的抽象接口和高层逻辑...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 511,821
精华内容 204,728
关键字:

服务抽象