云原生|kubernetes|2022年底cks真题解析(11-16)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
日志服务 SLS,月写入数据量 50GB 1个月
简介: 云原生|kubernetes|2022年底cks真题解析(11-16)

前言:

接上一篇文章:云原生|kubernetes|2022年底cks真题解析(1-10)_晚风_END的博客-CSDN博客

2022年底的csk真题第二部分 11题到16题

十一,

Trivy 扫描镜像安全漏洞

题目:

Task
使用 Trivy 开源容器扫描器检测 namespace kamino 中 Pod 使用的具有严重漏洞的镜像。
查找具有 High 或 Critical 严重性漏洞的镜像,并删除使用这些镜像的 Pod。
注意:Trivy 仅安装在 cluster 的 master 节点上,
在工作节点上不可使用。
你必须切换到 cluster 的 master 节点才能使用 Trivy。

解析:

这道题比较的简单,具体的trivy扫描工具的部署见我的博客:云原生|kubernetes|安全漏扫神器trivy的部署和使用_晚风_END的博客-CSDN博客_trivy

当然了,在考试环境,不存在无法升级trivy-db数据库的问题,可以放心使用。trivy扫描镜像漏洞还是比较快的,基本每个镜像十来秒就扫描完了

根据题目要求,关键点在于如何找到给定的namespace kamino内的pod所有的所使用的镜像名称,下面提供一个比较简单的方法:

kubectl get po --help
。。。。。。。。。前面的略略略。。。。。。。。。。
Usage:
  kubectl get
[(-o|--output=)json|yaml|name|go-template|go-template-file|template|templatefile|jsonpath|jsonpath-as-json|jsonpath-file|custom-columns|custom-columns-file|wide]
(TYPE[.VERSION][.GROUP] [NAME | -l label] | TYPE[.VERSION][.GROUP]/NAME ...) [flags] [options]

OK,我们选用custom-columns自定义字段来输出镜像名称(这里以kube-system这个namespace为例):

kubectl get po -n kube-system --output=custom-columns="IMAGE:.spec.containers[*].image"
IMAGE
docker.io/calico/kube-controllers:v3.21.2
docker.io/calico/node:v3.21.2
docker.io/calico/node:v3.21.2
docker.io/calico/node:v3.21.2
registry.aliyuncs.com/google_containers/coredns:v1.8.4
registry.aliyuncs.com/google_containers/coredns:v1.8.4
registry.aliyuncs.com/google_containers/etcd:3.5.0-0
registry.aliyuncs.com/google_containers/kube-apiserver:v1.22.10
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.22.10
registry.aliyuncs.com/google_containers/kube-proxy:v1.22.10
registry.aliyuncs.com/google_containers/kube-proxy:v1.22.10
registry.aliyuncs.com/google_containers/kube-proxy:v1.22.10
registry.aliyuncs.com/google_containers/kube-scheduler:v1.22.10
ccr.ccs.tencentyun.com/gcr-containers/metrics-server:v0.5.2

然后使用for循环检测:

 a=`kubectl get po -n kube-system  --output=custom-columns="IMAGE:.spec.containers[*].image"`
for i in $a;do trivy image --skip-update  -s 'HIGH,CRITICAL' $i;done

检测结果可以重定向到文件内,然后用搜索大法查看结果即可,有 High 或 Critical漏洞的pod删除掉即可。

解答:

1 切换到 Master 的 candidate 下
ssh master01
2 获取命名空间 kamino 下的所有 pod 的 image
a=`kubectl get po -n kamino  --output=custom-columns="IMAGE:.spec.containers[*].image"`
3, for 循环扫描
for i in $a;do trivy image --skip-update  -s 'HIGH,CRITICAL' $i;done >11.txt
4,
人肉搜索上面的扫描结果,有符合漏洞的pod手动删除并确认结果即可

十二,

Container 安全上下文

题目:

Context
Container Security Context 应在特定 namespace 中修改 Deployment。
Task
按照如下要求修改 sec-ns 命名空间里的 Deployment secdep
一、用 ID 为 30000 的用户启动容器(设置用户 ID 为: 30000)
二、不允许进程获得超出其父进程的特权(禁止 allowPrivilegeEscalation)
三、以只读方式加载容器的根文件系统(对根文件的只读权限)

解析:

这个题目是关于pod 的security context,配置的地方比较多,因此还是需要使用官方文档,以关键字 security context在官方文档内搜索即可。

解答:

按照题目要求,在线修改
kubectl -n sec-ns edit deployment secdep
在 template 字段下面的 spec 里面,添加或修改如下红字内容,并保存(考试中也是在 Deployment 下有两个 image 的)
请注意,考试先检查 spec 下面(非 containers 下面)是否有 securityContext: {},如果有则可以直接修改即可。否则重复添加是不生效的。
 template:
 metadata:
 creationTimestamp: null
 labels:
 app: secdep
 spec:
 containers:
 image: busybox:1.28
 imagePullPolicy: IfNotPresent
 name: sec-ctx-demo-1
 securityContext:
 allowPrivilegeEscalation: false
 readOnlyRootFilesystem: true
 resources: {}
 terminationMessagePath: /dev/termination-log
按照题目要求,在线修改
kubectl -n sec-ns edit deployment secdep
在 template 字段下面的 spec 里面,添加或修改如下红字内容,并保存(考试中也是在 Deployment 下有两个 image 的)
请注意,考试先检查 spec 下面(非 containers 下面)是否有 securityContext: {},如果有则可以直接修改即可。否则重复添加是不生效的。
 template:
 metadata:
 creationTimestamp: null
 labels:
 app: secdep
 spec:
 containers:
 image: busybox:1.28
 imagePullPolicy: IfNotPresent
 name: sec-ctx-demo-1
 securityContext:
 allowPrivilegeEscalation: false
 readOnlyRootFilesystem: true
 resources: {}
 terminationMessagePath: /dev/termination-log

十三,

日志审计 log audit

题目:

Task
在 cluster 中启用审计日志。为此,请启用日志后端,并确保:
⚫ 日志存储在 /var/log/kubernetes/audit-logs.txt
⚫ 日志文件能保留 10 天
⚫ 最多保留 2 个旧审计日志文件
/etc/kubernetes/logpolicy/sample-policy.yaml 提供了基本策略。它仅指定不记录的内容。
注意:基本策略位于 cluster 的 master 节点上。
编辑和扩展基本策略以记录:
⚫ RequestResponse 级别的 persistentvolumes 更改
⚫ namespace front-apps 中 configmaps 更改的请求体
⚫ Metadata 级别的所有 namespace 中的 ConfigMap 和 Secret 的更改
此外,添加一个全方位的规则以在 Metadata 级别记录所有其他请求。
注意:不要忘记应用修改后的策略。

解析:

这道题需要配置的地方比较多,因此,还是需要官方文档查询的,关键字audit 审计 | Kubernetes

需要编辑/etc/kubernetes/logpolicy/sample-policy.yaml ,按题目要求修改,然后修改apiserver的配置文件,增加后端配置,最终在/var/log/kubernetes/audit-logs.txt这个文件中可以看到有输出表明此题完成。

解答:

本题分数比较多,占 12%。 日志审计这一题需要自己调整的内容还是挺多的,因此要非常仔细,建议修改前备份一下原始的环境,要不然修改错了就会导致集群崩溃。

 配置审计策略
先备份配置文件
mkdir bak5
cp /etc/kubernetes/logpolicy/sample-policy.yaml bak5/
vim /etc/kubernetes/logpolicy/sample-policy.yaml
参考官方网址内容
注意这个文件里的最后一句英文,Please do not delete the above rule content, you can continue to add it below.
考试时,也有类似的一句话,大体是告诉你,不要删除上面的规则,你只可以在下面继续追加题目要求的规则。
……
rules:
###此处省略默认带有的一些规则,不要修改,而是继续添加如下规则。
 # namespaces changes at RequestResponse level
 - level: RequestResponse
 resources:
 - group: ""
 resources: ["persistentvolumes"] #根据题目要求修改,比如题目要求的是 namespaces。
 #the request body of persistentvolumes/pods changes in the namespace front-apps
 - level: Request
 resources:
 - group: ""
 resources: ["configmaps"] #根据题目要求修改,比如题目要求的是 persistentvolumes 或者 pods。
 namespaces: ["front-apps"]
 # Log configmap and secret changes in all other namespaces at the Metadata level.
 - level: Metadata
 resources:
 - group: ""
 resources: ["secrets", "configmaps"]
 # Also, add a catch-all rule to log all other requests at the Metadata level.
 - level: Metadata
 omitStages:
 - "RequestReceived"
配置 master 节点的 kube-apiserver.yaml
先备份配置文件
mkdir bak5
cp /etc/kubernetes/manifests/kube-apiserver.yaml bak5/
vi /etc/kubernetes/manifests/kube-apiserver.yaml
添加以下参数:注意空格要对齐,不建议放到最后,建议按照下图的位置放这四条信息。
#定义审计策略 yaml 文件位置,通过 hostpath 挂载
 - --audit-policy-file=/etc/kubernetes/logpolicy/sample-policy.yaml #主意检查,如果考试中已经存在了,则不要重复添加。
#定义审计日志位置,通过 hostpath 挂载
 - --audit-log-path=/var/log/kubernetes/audit-logs.txt #主意检查,如果考试中已经存在了,则不要重复添加。
#定义保留旧审计日志文件的最大天数为 10 天
 - --audit-log-maxage=10 #主意检查,如果考试中已经存在了,则不要重复添加。
#定义要保留的审计日志文件的最大数量为 2 个
 - --audit-log-maxbackup=2 #主意检查,如果考试中已经存在了,则不要重复添加。
#在 kube-apiserver.yaml 文件的 volumeMounts 标签下增加
 volumeMounts: #找到这个字段,添加下面内容
 - mountPath: /etc/kubernetes/logpolicy/sample-policy.yaml #这里也可以写到目录/etc/kubernetes/logpolicy/
 name: audit #注意,在 1.25 考试中,蓝色的内容已经默认有了,你只需要添加绿色字体的内容。可以通过红色字,在文件中定位。但模拟环境没有加,
需要你全部手动添加。这样是为了练习,万一考试中没有,你也会加。但是如果考试中已添加,你再添加一遍,则会报错,导致 api-server 启不起来。
 readOnly: true #这个为 true
 - mountPath: /var/log/kubernetes/
 name: audit-log #注意,在 1.25 考试中,蓝色的内容已经有了,你只需要添加绿色字体的内容。可以通过红色字,在文件中定位。但模拟环境没有加,
需要你全部手动添加。这样是为了练习,万一考试中没有,你也会加。
 readOnly: false #这个为 false
#在 kube-apiserver.yaml 文件的 volumes 标签下增加
 volumes: #找到这个字段,添加下面内容 #注意,在 1.25 考试中,蓝色的内容已经有了,volumes 这段无需修改,但是为了以防万一,模拟环境中没有
加,需要你手动添加。这样是为了练习,万一考试中没有,你也会加。
 - name: audit
 hostPath:
 path: /etc/kubernetes/logpolicy/sample-policy.yaml #这里如果写到目录/etc/kubernetes/logpolicy/,则下面的 type:应为 type: DirectoryOrCreate
 type: File
 - name: audit-log
 hostPath:
 path: /var/log/kubernetes/
 type: DirectoryOrCreate

十四,

启用 API server 认证

题目:

Context
由 kubeadm 创建的 cluster 的 Kubernetes API 服务器,出于测试目的,
临时配置允许未经身份验证和未经授权的访问,授予匿名用户 cluster-admin 的访问权限.
Task
重新配置 cluster 的 Kubernetes APl 服务器,以确保只允许经过身份验证和授权的 REST 请求。
使用授权模式 Node,RBAC 和准入控制器 NodeRestriction。
删除用户 system:anonymous 的 ClusterRoleBinding 来进行清理。
注意:所有 kubectl 配置环境/文件也被配置使用未经身份验证和未经授权的访问。
你不必更改它,但请注意,一旦完成 cluster 的安全加固, kubectl 的配置将无法工作。
您可以使用位于 cluster 的 master 节点上,cluster 原本的 kubectl 配置文件
/etc/kubernetes/admin.conf ,以确保经过身份验证的授权的请求仍然被允许。

解析:

首先,这道题需要根据题目要求登陆到正确的master服务器上,也就是说要ssh一下,然后修改配置前还是需要备份一下文件。

讲道理,这道题目是比较简单的,基本怎么修改题目里已经讲的非常清楚了,kubelet的配置是有问题的,但我们不需要更改这些,如果kubelet有问题,使用/etc/kubernetes/admin.conf 这个config文件即可。

解答:

确保只有认证并且授权过的 REST 请求才被允许
编辑/etc/kubernetes/manifests/kube-apiserver.yaml,修改下面内容
- --authorization-mode=AlwaysAllow
- --enable-admission-plugins=AlwaysAdmit
vi /etc/kubernetes/manifests/kube-apiserver.yaml
修改为
- --authorization-mode=Node,RBAC #注意,只保留 Node,RBAC 这两个,中间是英文状态下的逗号。在 1.25 考试中,这一条可能默认已经有
了,但还是要检查确认一下。
- --enable-admission-plugins=NodeRestriction #在 1.25 考试中,这一个原先为 AlwaysAdmit,需要修改为 NodeRestriction。
重启 kubelet
systemctl daemon-reload
systemctl restart kubelet
 删除题目要求的角色绑定
kubectl get clusterrolebinding system:anonymous
kubectl delete clusterrolebinding system:anonymous
再检查
kubectl get clusterrolebinding system:anonymous

十五,

TLS 安全配置

题目:

Task
通过 TLS 加强 kube-apiserver 安全配置,要求
1、kube-apiserver 除了 VersionTLS13 及以上的版本可以使用,其他版本都不允许使用。
2、密码套件(Cipher suite)为 TLS_AES_128_GCM_SHA256
通过 TLS 加强 ETCD 安全配置,要求
1、密码套件(Cipher suite)为 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256

解析:

这道题不需要查询官方文档

首先,我们需要ssh登陆题目指定的服务器,看看apiserver的配置和etcd的配置,可以发现默认的集群是没有配置tls安全的

根据题目的描述,我们需要修改的文件是kube-apiserver.yaml和etcd.yaml 这两个文件,官方文档以关键字VersionTLS13查询即可

 kube-apiserver | Kubernetes

不使用官方文档的方法:

root@k8s-master:~# kubectl exec -n kube-system kube-apiserver-k8s-master -- kube-apiserver --help |grep tls
      --cert-dir string                        The directory where the TLS certs are located. If --tls-cert-file and --tls-private-key-file are provided, this flag will be ignored. (default "/var/run/kubernetes")
      --tls-cert-file string                   File containing the default x509 Certificate for HTTPS. (CA cert, if any, concatenated after server cert). If HTTPS serving is enabled, and --tls-cert-file and --tls-private-key-file are not provided, a self-signed certificate and key are generated for the public address and saved to the directory specified by --cert-dir.
      --tls-cipher-suites strings              Comma-separated list of cipher suites for the server. If omitted, the default Go cipher suites will be used. 
      --tls-min-version string                 Minimum TLS version supported. Possible values: VersionTLS10, VersionTLS11, VersionTLS12, VersionTLS13
      --tls-private-key-file string            File containing the default x509 private key matching --tls-cert-file.
      --tls-sni-cert-key namedCertKey          A pair of x509 certificate and private key file paths, optionally suffixed with a list of domain patterns which are fully qualified domain names, possibly with prefixed wildcard segments. The domain patterns also allow IP addresses, but IPs should only be used if the apiserver has visibility to the IP address requested by a client. If no domain patterns are provided, the names of the certificate are extracted. Non-wildcard matches trump over wildcard matches, explicit domain patterns trump over extracted names. For multiple key/certificate pairs, use the --tls-sni-cert-key multiple times. Examples: "example.crt,example.key" or "foo.crt,foo.key:*.foo.com,foo.com". (default [])
      --service-account-key-file stringArray              File containing PEM-encoded x509 RSA or ECDSA private or public keys, used to verify ServiceAccount tokens. The specified file can contain multiple keys, and the flag can be specified multiple times with different files. If unspecified, --tls-private-key-file is used. Must be specified when --service-account-signing-key is provided

kube-apiserver的帮助命令里有如何配置,只需要将题目要求的密码套件值填入即可。

解答:

修改 kube-apiserver
修改之前,备份一下配置文件。
mkdir bak15
cp /etc/kubernetes/manifests/kube-apiserver.yaml bak15/
vim /etc/kubernetes/manifests/kube-apiserver.yaml
添加或修改相关内容,并保存(先检查一下,如果考试环境里已经给你这两条了,则你只需要修改即可)
 - --tls-cipher-suites=TLS_AES_128_GCM_SHA256
 - --tls-min-version=VersionTLS13
修改 etcd
修改之前,备份一下配置文件。
mkdir bak15
cp /etc/kubernetes/manifests/etcd.yaml bak15/
vim /etc/kubernetes/manifests/etcd.yaml
添加或修改相关内容,并保存
 - --cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
修改完成后,需要等待 3 分钟,等集群应用策略后,再检查一下所有 pod,特别是 etcd 和 kube-apiserver 两个 pod,确保模拟环境是正常的。
kubectl get pod -A
kubectl -n kube-system get pod

十六,

Sysdig & falco

题目:

Task:
使用运行时检测工具来检测 Pod tomcat123 单个容器中频发生成和执行的异常进程。
有两种工具可供使用:
⚫ sysdig
⚫ falco
注: 这些工具只预装在 cluster 的工作节点 node02 上,不在 master 节点。
使用工具至少分析 30 秒 ,使用过滤器检查生成和执行的进程,将事件写到 /opt/KSR00101/incidents/summary 文件中,
其中包含检测的事件, 格式如下:
timestamp,uid/username,processName
保持工具的原始时间戳格式不变。
注: 确保事件文件存储在集群的工作节点上。
请注意,考试时,考题里已表明 sysdig 在工作节点上,所以你需要 ssh 到开头写的工作节点上。

解析:

sysdig是一个工具合集,netstat,top,htop,lsof等等命令的功能它都可以实现,考试系统是Ubuntu,在此系统下也是可以非常方便的安装sysdig

Ubuntu下安装sysdig的命令为:

apt-get install sysdig

sysdig的参数是比较多得,-M 30  就是持续扫描30秒的意思了。

根据题目要求,扫描后的输出要有一定的格式,格式查询可以如下命令:

sysdig -l | grep time
sysdig -l | grep uid
sysdig -l | grep proc

现在的考试应该是使用的containerd运行时,因此,需要先找出containerd的socket:

crictl info | grep sock

其次,扫描对象是容器,因此,需要找到容器的ID,命令如下:

crictl ps | grep tomcat123

得到以上信息后就进行扫描工作了:

sysdig -M 30 -p "%evt.time,%user.name,%proc.name" --cri /run/containerd/containerd.sock container.name=tomcat123 >> /opt/KSR00101/incidents/summary

最后的结果大概是这样的形式:

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
18天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
95 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
2天前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
28 10
|
2天前
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
2月前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
2月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
2月前
|
Kubernetes 监控 API
深入解析Kubernetes及其在生产环境中的最佳实践
深入解析Kubernetes及其在生产环境中的最佳实践
79 1
|
2月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
2月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
98 2
|
17天前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
17天前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象结构型模式比类结构型模式具有更大的灵活性。 结构型模式分为以下 7 种: • 代理模式 • 适配器模式 • 装饰者模式 • 桥接模式 • 外观模式 • 组合模式 • 享元模式
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析